// 答案选D
// 这是一个闭包。
把for(var i = 0; i < 4; i++) {
elems[i].onclick = function () {
alert(i);
};
}
// 拆成这样来看就明白
for (var i = 0; i < 4; i++) {
function () {
alert(i); //这里输出的是4,因为被循环了
};
}
// 和这个差不多
var i = 0;
function () {
alert(i); //这里输入的是0;
}
// alert的i, 其实还是for里面的那个i, 因为i循环了4次, 所以alert的i累加了4次, 就成了4。
// 闭包: 有权访问另一个函数作用域中的变量函数。 闭包保存的是整个 变量对象, 而不是某个特殊的变量。
// 闭包与变量: 闭包只能取得包含函数中任何变量的最后一个值。
//
// 每个li标签的onclick事件执行时, 本身onclick绑定的function的作用域中没有变量i, i为undefined, 则解析引擎会寻找父级作用域, 发现父级作用域中有i, 且for循环绑定事件结束后, i已经赋值为4, 所以每个li标签的onclick事件执行时, alert的都是父作用域中的i, 也就是4。 这是作用域的问题。
var elements = document.getElementsByTagName('li');
var length = elements.length;
for (var i = 0; i < length; i++) {
elements[i].onclick = (function (a) {
return function () {
alert(a);
}
})(i);
}
//用此代码可以依次弹出 0,1,2,3(闭包可以“包养”外部函数变量)
// 或者
var elements = document.getElementsByTagName('li');
var length = elements.length;
var handler = function (i) {
return fucntion() {
alert(i);
}
}
for (var i = 0; i < length; i++) {
elements[i].onclick = handler(i);
}
// 避免在循环中创建函数,可以在循环之外创建一个辅助函数,让这个辅助函数返回一个绑定了当前i值得函数,避免混淆
闭包经典题(答案及解释)
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 【蝴蝶效应】 蝴蝶效应:上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶...