炒鸡难理解 ,请老师解答
来源:16-11 作用域和闭包--解题-代码演示
纯情掉了一地
2018-02-27
我通常做法:
for(var i=0;i<5;i++){
var a=document.createElement('a');
a.innerHTML=i+"<br>";
a.index=i;
a.addEventListener('click',function (e) {
e.preventDefault();
console.log(this.index)
});
document.body.appendChild(a);
}
因为难以理解,吧i改为index;
var i;
for (i = 0; i < 4; i++) {
(function (index) {
var a = document.createElement('a')
a.innerHTML = i + '<br>';
a.addEventListener('click', function (e) {
e.preventDefault();
console.log(index)
});
console.log(index)
document.body.appendChild(a)
})(i);
}
请问老师:index的值是如何与当前点击对象关联起来的,我知道可以通过this获取当前,那这样循环创建的方式,是不是等于创建了4个闭包??,index值保存到了哪里??是创建时的作用域么?
2回答
-
双越
2018-02-27
是不是等于创建了4个闭包??——是的
index值保存到了哪里??是创建时的作用域么?——是的
你说的都没问题啊,看不出你哪里有疑问
122018-02-27 -
兮漫天
2019-04-28
你上面定义的 a.index 相当于 是给你的a标签 添加了一个自定义属性 index,然后把全局自由变量i,也就是for循环里面的那个i 赋值给了你定义的index! 相当于是这样 <a index=i></a> 这里i就是你for循环的那个数,循环到几就是几!通过这样方式,把它们进行了绑定,所以你下面在点击的时候,可以弹出它当前自己之前定义的index属性!这么说不知道你理解吗?
通过.index这种方式为node增加属性,属于隐式添加,你在元素节点上看不到添加的属性,你在使用添加index自定义属性的时候,使用ECMA提供的 setAttribute 方法就一目了然了!setAttribute('index',i)它们结果是一样的!希望可以帮到你~
至于你最后说的,index是存储到了作用域么,并不是,它相当于是存储给了 a 这个变量,它是一个基本类型,保存的话也是保存在了内存当中,保存在栈空间!然后通过值来访问!
00
相似问题