1 函数创建
2 函数声明
3 函数表达式
4 函数的非标准的name属性
一个非标准的 name 属性,通过这个属性可以访问到给函数指定的名字。这个属性的值永远等于跟在 function 关键字后面的标识符。
//只在 Firefox 、Safari、Chrome 和 Opera 有效。
alert (functionName.name); // ‘functionName’
5 递归
6 arguments
arguments.callee是一个指向正在执行函数的指针。
严格模式下不能通过脚本访问arguments.callee。访问这个属性会导致错误。
严格模式下,不能通过脚本访问 arguments.callee , 访问这个属性会导致错误。不过,可以使用命名函数表达式来达到相同的效果。
7 闭包
8 定义:
函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为:闭包(这个术语非常古老,是指函数变量可以被隐藏于作用域链之内,因此看起来函数将变量“包裹”了起来。)
来自:《JavaScript权威指南第六版》
9 代码实例:
例子1:
例子2:
例子3:
10 call和apply方法
call 和 apply 都是函数的方法。调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。
11 apply:
- 将函数作为对象的方法来调用
- 将参数以数组的形式传递给该方法
注意:call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。
12 语法:
func.apply(thisArg, [argsArray])
需要注意:Chrome 14 以及 Internet Explorer 9 仍然不接受类数组对象。如果传入类数组对象,它们会抛出异常。
13 示例代码
简单的 apply 小例子
var fn = function(year) {
this.year = year;
alert(‘我叫:’ + this.name + ‘;’ + ‘我今年:’ + this.age + ‘岁’ + ‘; 今年:’ + year)
};
var obj = { name : ‘lixiaohua’ , age : 32};
fn.apply(obj,[‘2019’])
用 apply 将数组添加到另一个数组
var array = [‘a’, ‘b’];
var elements = [0, 1, 2];
array.push.apply(array, elements);
console.info(array); // [“a”, “b”, 0, 1, 2]
使用apply和内置函数
但是当心:如果用上面的方式调用apply,会有超出JavaScript引擎的参数长度限制的风险。当你对一个方法传入非常多的参数(比如一万个)时,就非常有可能会导致越界问题, 这个临界值是根据不同的 JavaScript 引擎而定的(JavaScript 核心中已经做了硬编码 参数个数限制在65536),因为这个限制(实际上也是任何用到超大栈空间的行为的自然表现)是未指定的. 有些引擎会抛出异常。更糟糕的是其他引擎会直接限制传入到方法的参数个数,导致参数丢失。举个例子:如果某个引擎限制了方法参数最多为4个(实际真正的参数个数限制当然要高得多了, 这里只是打个比方), 上面的代码中, 真正通过 apply传到目标方法中的参数为 5, 6, 2, 3 而不是完整的数组。
如果你的参数数组可能非常大,那么推荐使用下面这种策略来处理:将参数数组切块后循环传入目标方法:
使用apply来链接构造器
你可以使用apply来链接一个对象构造器,类似于Java。在接下来的例子中我们会创建一个全局Function 对象的construct方法 ,来使你能够在构造器中使用一个类数组对象而非参数列表。
14 bind()方法
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
bind()方法创建一个新的函数,在调用时设置this关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。
15 语法和描述:
function.bind(thisArg[, arg1[, arg2[, …]]])
16 参考《JavaScript权威指南第6版》描述
17 示例代码
代码1:简单的绑定
代码2:创建绑定函数
bind() 最简单的用法是创建一个函数,不论怎么调用,这个函数都有同样的 this 值。JavaScript新手经常犯的一个错误是将一个方法从对象中拿出来,然后再调用,期望方法中的 this 是原来的对象(比如在回调中传入这个方法)。如果不做特殊处理的话,一般会丢失原来的对象。基于这个函数,用原始的对象创建一个绑定函数,巧妙地解决了这个问题: