有问题请教老师

来源: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回答

好帮手慕慕子

2021-03-30

同学你好,对于你的问题解答如下:

1、下图所示理解是对的

http://img.mukewang.com/climg/60628525091da8da07200121.jpg

2、因为arr数组中每一项的fn属性指向的函数是在bind函数中声明的,类似于下图这种写法,先声明了一个函数,然后赋值给fn属性,示例:

http://img.mukewang.com/climg/6062861c099ee40405160303.jpg

这就相当于在外部还引用着函数中的变量,所以bind函数执行完之后不会立即销毁。

祝学习愉快~

0

粉墨登场

提问者

2021-03-29

噢老师,突然懂了,在定义三个函数时,只是定义但是并没有立刻执行。当方法执行时,在当前作用域中找不到i,就往上一层作用域中查找i,因为i最后是3,所以三个方法弹出的都是3。 但是bind函数执行过后不是会被销毁吗? 那还能找到变量i吗?

0

0 学习 · 6815 问题

查看课程