函数类型

函数实际上是对象,因为每个函数都是Function这个构造函数的实例,具有Funtion构造函数定义的属性和方法。函数名实际上时指向函数对象的指针,说明这个问题,看如下代码:

    function sum(a,b) {return a + b;}// 相当于把sum的引用地址传递给sum2。// 注意:不带圆括号的函数名是访问函数指针,而非调用函数var sum2 = sum; sum2(1,2) // 3sum = null;sum(2,3) // undefined // 将sum的内存回收,即sum的引用地址变了sum2(2,3) //5 // 但sum2 还是指向原来的内存地址

1. 没有重载

理解了上面之后,重载相当于给函数变量重新修改了引用的值,因此后面会覆盖前面的,很容易理解了。

2.函数提升

其实和变量提升类似,就是声明型函数和表达式定义函数的区别,很简单

3.作为值的函数

因为函数名本身是变量,所以可以作为值进行传递,这里有一个很好的例子,也是一个很好的编程思想,如下:

function getSomeFunction(fn,arg) {return fn(arg);
}
function add(num) {return num + 10;
}
function getGreeting(name) {return `Hello ${name}`;
}
getSomeFunction(add,5) // 15
getSomeFunction(getGreeting,'andy') // Hello andy

还可以从一个函数中返回另一个函数。例如我们在用数组的一些排序方法或者迭代方法的时候,因为传递进去的都是一个函数变量作为参数,所以这个参数我们可以用“外部函数返回函数”的方法进行编写,这样做的好处是,返回的函数可以把我们”特定想要规定”的参数传递进去进行计算,例如

// 规定利用哪个属性进行排序,如果不填则代表数组从大到小排序
function sortArgFuntion(compareProperty) { //compareProperty是上文中特定想要规定的参数return function (val1, val2) {if (compareProperty === undefined) {  // 如果排序的是数组的值,则用常规的方法if (val1 > val2) {return 1;} else if (val1 < val2) {return -1;} else {return 0;}} else {    // 如果排序的是对象的属性则用该方法if (val1[compareProperty] > val2[compareProperty]) {return 1;} else if (val1[compareProperty] < val2[compareProperty]) {return -1;} else {return 0;}}}
}
var data = [{name: 'andy',age: 25
}, {name: 'Nf',age: 29
}]
data.sort(sortArgFuntion('name'))

sort函数的参数是个函数,用于将数组进行重排序。而我们将这个函数参数拿出来,就可以更直观的、复用性更高的去编写这个函数,达到我们想要的效果。同时需要仔细揣摩,理解函数返回函数的精髓和独到之处

4.函数内部属性

函数内部有两个特殊变量

  • arguments
  • this

arguments

是类数组对象,何为类数组对象呢?可以通过序号进行数组式的访问(如obj[1]),并且有length属性(对象你不定义length属性,是没有length的).类数组只有索引值和长度,没有数组的各种方法,所以如果要类数组调用数组的方法,就需要使用Array.prototype.method.call 来实现

this

this是JavaScript非常容易混淆和复杂的一个知识点,他代表什么完全取决于调用位置,我会但列出一篇总结this。e.g:

window.color = 'red';
var o = {color:"blue"};
function sayColor() {console.log(this.color)
}
sayColor(); // red 因为调用位置是全局
o.sayColor = sayColor;
o.sayColor(); // blue 因为调用位置是o的对象里

从上面例子中我们要知道,函数名字仅仅是一个指针,虽然执行环境不同,全局的sayColor()和函数中的o.sayColor()指向的都是同一个函数

caller

es5新加的,他返回当前函数(必须是函数,对象不行)的调用环境,如果调用环境是全局,则返回null。有两种用法,一种是函数名加caller,一种是arguments.callee.caller

    function outer() {console.log(outer.caller); //nullinner();};function inner() {console.log(inner.caller); // outer里的代码}

5.函数的属性和方法

因为函数也是对象,所以也有属性和方法;函数里面有length和prototype两个属性,length指传入形参的个数
function add(num1,num2) {} console.log(add.length) // 2

propertype(回头好好研究一番)

对于引用类型而言,propertype是保存所有实例方法的真正所在。在创建自定义引用类型以及实现继承,它的作用及其关键(到底多关键暂时还不太理解,尤其是继承这个词:)) es5中propertype不可枚举,因此不能遍历。

apply() 和 call()

两个参数,第一个参数是在哪个作用域运行,第二个参数apply是传入的Array或者arguments对象,call是传入每个值,其余他俩一模一样。这是其中一个例子,用来说明apply和call的作用:

    var color = "red";var o = {color:"blue"};function sayColor() {alert(this.color)}sayColor(); // redsayColor.call(this); // red sayColor.call(window); // redsayColor.call(o); // blue 

如果不用call的话我们需要这样做:

    var color = "red";var o = {color:"blue"};function sayColor() {alert(this.color)}o.sayColor = sayColor;o.sayColor(); //blue

所以对比可以一目了然,call一个最大的作用是实现了对象和方法的解耦

bind方法

bind方法用来构建一个函数的实例,其this对象指向bind规定的作用域。e.g:

    var color = "red";var obj = {color:"blue"}function sayColor() {console.log(this.color);}var bindSayColor = sayColor.bind(obj);bindSayColor(); // blue

JavaScript中的函数相关推荐

  1. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  2. Javascript中的函数重载-最佳做法

    用JavaScript伪造函数重载的最佳方法是什么? 我知道不可能像其他语言一样重载Javascript中的函数. 如果我需要两个函数一起使用foo(x)和foo(x,y,z) ,这是最佳/首选方式: ...

  3. 彻底理解JavaScript中回调函数 (推荐)

    在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...

  4. JavaScript中Exists函数

    JavaScript中Exists函数是如果 Dictionary 对象中存在所指定的主键则返回 true,否则返回 false.使用方法: object.Exists(key) 其中object是必 ...

  5. javascript中setTimeout()函数

    javascript中setTimeout()函数 大家都知道javascript中的setTimeput()函数的作用,一般会用他来处理一些连续的事情,们先看一个例子: <head>   ...

  6. Javascript中call函数和apply函数的使用

    Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: so ...

  7. JavaScript中的函数表达式

    在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表 ...

  8. JavaScript中charAt函数

    JavaScript中charAt函数的作用是返回指定索引位置处的字符. 使用方法: strObj.charAt(index) 其中 strObj是必选项.任意 String 对象或文字. index ...

  9. javaScript 中 call 函数的用法说明

    javaScript 中 call 函数的用法说明 javaScript 中的 call() 是一个奇妙的方法,但也是一个让人迷惑的方法,先看一下官方的解释: call 方法 请参阅 应用于:Func ...

  10. JavaScript中ubound函数

    JavaScript中ubound函数方法是返回在 VBArray 的指定维中所使用的最大索引值.使用方法: safeArray.ubound(dimension) 其中safeArray是必选项.是 ...

最新文章

  1. android6.0麦克风权限,android 6.0权限检测以及6.0以下,麦克风、相机权限判断
  2. python学习 day2 (3月2日)
  3. java documentlistener_java在DocumentListener中更改文档
  4. 4分钟训练ImageNet!腾讯机智创造AI训练世界纪录
  5. 数学--数论--莫比乌斯函数
  6. org.apache.hadoop.hbase.ClockOutOfSyncException
  7. 关于在头文件中定义变量
  8. javaweb解决编码问题_学习编码? 首先,学会解决问题。
  9. Pytorch:损失函数
  10. Linux操作系统内核源码目录结构详解
  11. [转载] python mongodb update
  12. UVa 10048 (Floyd变形) Audiophobia
  13. 1.1 波士顿房价预测
  14. k2.第一章 基于kubeadm安装kubernetes v1.20 -- 集群部署(二)
  15. 瀚高数据库适配定时框架Quartz
  16. 马哥教育42期第四周作业
  17. 公关作用下的品牌建设
  18. html5在微信浏览器下调用复制功能
  19. postman与fiddler
  20. 封禁、下架!微信出手了,规范整治数字藏品平台!

热门文章

  1. Android 自定义view时用到的TypedArray
  2. Android开发之多Fragment切换优化
  3. IOS开发笔记10-Object-C中的对象
  4. php调用搜狗ocr接口,搜狗ocr识别接口
  5. Git_Eclipse:[3]Git初始化工程
  6. Java线程池 源码分析
  7. 合并果子(NOIP2004)
  8. JS数组转字符串和字符串转数组
  9. Flex 学习笔记 动态设置itemRenderer
  10. LINQ中的Let关键字