functioncreateFunction() { const res = newArray() for (var i = 0; i < 10; i++) { res[i] = function () { return i } } return res } console.log(createFunction()[0]()) // 10 console.log(createFunction()[1]()) // 10 console.log(createFunction()[2]()) // 10
上面例子中的函数应该返回应该函数数组,表面上看,函数中的每个函数执行后应该返回它的索引值,但是实际上每个函数返回的都是 10 。原因在于每个函数中所引用的变量 i 都是同一个变量 i 。当 createFunction() 执行完成后, i 的值等于 10 ,所有数组中每个函数返回的都是同一个变量的值 10 。我们可以通过创建另一个匿名函数强制让闭包的行为符合预期( var 定义的变量在函数内有块级作用域)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
functioncreateFunction() { const res = newArray() for (var i = 0; i < 10; i++) { res[i] = function (num) { returnfunction() { return num } }(i) } return res } console.log(createFunction()[0]()) // 0 console.log(createFunction()[1]()) // 1 console.log(createFunction()[2]()) // 2
当然上面的问题也与 var 定义的变量没有块级作用域有关,在 ES6 语法中可以通过 let 关键字定义变量 i 解决这个问题。
关于 this 对象
this 对象是在运行时基于函数的执行环境绑定的:在全局函数中, this 等于 window ,而在函数被作为对象的方法调用时, this 等于当前调用方法的对象。匿名函数的执行具有全局性,它 this 对象通常指向 window 。
1 2 3 4 5 6 7 8 9 10 11
let name = 'window' const object = { name: 'object', getName: function () { returnfunction () { returnthis.name } } }