美文网首页
闭包经典题(答案及解释)

闭包经典题(答案及解释)

作者: 锋享前端 | 来源:发表于2018-09-21 15:06 被阅读0次
// 答案选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值得函数,避免混淆

相关文章

  • 闭包经典题(答案及解释)

  • 关于Javascript闭包的总结

    关于闭包这个词的解释 维基百科中对于闭包的经典解释: 在计算机科学中,闭包(Closure)是词法闭包(Lexic...

  • 闭包经典题

    小测试 手动想想为何输出以上值

  • 闭包经典题

    使用var或是非对象内部的函数表达式内,可以访问到存放当前函数的变量;在对象内部的不能访问到。 原因也非常简单,因...

  • 闭包经典题

    click me click me click me click me var elements = d...

  • JavaScript深入之闭包

    JavaScript深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。 定义 ...

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • iOS开发之Swift篇(7)—— 闭包

    目录 版本 闭包的定义及使用 尾随闭包 逃逸闭包 版本 Xcode 11.0Swift 5.1 闭包的定义及使用 ...

  • javascript-basis-important

    Mountain One --- 作用域及闭包 一、预解释(变量提升) var function 会进行浏览器...

网友评论

      本文标题:闭包经典题(答案及解释)

      本文链接:https://www.haomeiwen.com/subject/zcoanftx.html