直接上代码
```javascript <p id="lipu">我觉的还行</p> <p id="info">123</p> <p>E-mail: <input type="text" id="email" name="email"></p> <p>Name: <input type="text" id="name" name="name"></p> <p>Age: <input type="text" id="age" name="age"></p> <script type="text/javascript",charset="utf-8" > var obj ={count:0}; Object.defineProperty(obj, "reset", { get : function () { this.counter = 0;} }); function showContent(content){ document.getElementById('info').innerHTML = content; }; function setContent(){ var infoArr = [ {'id':'email','content':'your email address'}, {'id':'name','content':'your name'}, {'id':'age','content':'your age'} ]; for (let i = 0; i < infoArr.length; i++) { var item = infoArr[i]; document.getElementById(item.id).onfocus = function(){ showContent(item.content) } }结果 可以发现3个事件的内容都显示为"your age" 根据我查阅资料,造成这个原因是在for循环时,函数被依次压栈,同时压栈的函数保留了上次的item的地址,当for循环运行结束后,因为item是在在函数的上层上下文里面,而且定义为var,类似与一个函数在window中,所以此时的item因为循环以及变为了infoArr[2],for循环结束后,开始出栈,此时对应的值就为{‘id’:‘age’,‘content’:‘your age’},所以所以的影响都是Your age。
将var 变为 let,因为let是块级区域,每次for循环后,函数的上下文只能是在此时的值,不能共享
2.采用闭包,利用闭包,此时的作用域链指向当前函数的上下文的特性。
3.采用立即执行函数,不用压栈。 [1]: http://blog.rainy.im/2015/07/04/scope-chain-and-prototype-chain-in-js [2]: https://blog.csdn.net/qq_21132509/article/details/80694517