炒鸡难理解 ,请老师解答

来源: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值保存到了哪里??是创建时的作用域么?——是的

你说的都没问题啊,看不出你哪里有疑问

1
2
双越
回复
纯情掉了一地
index 是一个自由变量而已,它并没有你说的和点击对象的“关联”。你是从什么地方能看出“关联”来着?它仅仅就是一个自由变量,要获取它的值,就去相关的作用域去寻找,就这样。没有什么“关联”。
2018-02-27
共2条回复

兮漫天

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 这个变量,它是一个基本类型,保存的话也是保存在了内存当中,保存在栈空间!然后通过值来访问!

0
0

BAT大牛带你横扫初级前端JavaScript面试(第二版)

BAT高级前端工程师亲授,结合真实面试题,提高面试成功几率

4268 学习 · 817 问题

查看课程