有问题请教老师
来源:3-1 indexDB(1)
粉墨登场
2021-03-29 20:30:24
问题描述:
老师你好,这里看到一个题目,我把代码贴在下面。bind函数执行完成之后,三个添加的方法应该依次弹出0、1、2 ,为什么三个弹出的都是3呢? 如果说按照循环的最后,i确实是3,因为3不符合循环条件了,那么三个方法都会弹出3,但是bind函数在执行完之后不是会被释放掉吗?里面的变量也被释放了,bind函数也没有被全局变量引用。 请老师解答一下。
相关代码:
var arr = [{name: 1}, {name: 2}, {name: 3}];
function bind () {
for(var i = 0; i < arr.length; i++) {
arr[i].fn = function () {
alert(i);
};
};
console.log(i);
};
bind();
arr[0].fn(); // 3
arr[1].fn(); // 3
arr[2].fn(); // 3
2回答
同学你好,对于你的问题解答如下:
1、下图所示理解是对的
2、因为arr数组中每一项的fn属性指向的函数是在bind函数中声明的,类似于下图这种写法,先声明了一个函数,然后赋值给fn属性,示例:
这就相当于在外部还引用着函数中的变量,所以bind函数执行完之后不会立即销毁。
祝学习愉快~
粉墨登场
提问者
2021-03-29
噢老师,突然懂了,在定义三个函数时,只是定义但是并没有立刻执行。当方法执行时,在当前作用域中找不到i,就往上一层作用域中查找i,因为i最后是3,所以三个方法弹出的都是3。 但是bind函数执行过后不是会被销毁吗? 那还能找到变量i吗?
相似问题