美文网首页
关于闭包的一些思考

关于闭包的一些思考

作者: JohnsonChe | 来源:发表于2017-02-18 22:22 被阅读60次

今天知乎看到一个专栏,栏主就面试中的闭包问题吐槽了下现今一些前端从业者。
废话不说,进入正题。。。

// 请问输出什么
for (var i = 0; i < 10; ++i) {
    setTimeout(function () {console.log(i)}, 0);
}

以上这段代码输出什么?第二问,如果想让这段代码输出0123456789,应该怎么修改?

这是个闭包的问题,我也就这个问题再度复习了一下闭包。

解决方案很多:

方案1:

for(var i = 0; i < 10; i++) {
    (function(e) {
        setTimeout(function() {
            console.log(e)
        }, 1000)
    })(i)
}

方案2:

for(var i = 0; i < 10; i++) {
    setTimeout((function(e) {
        return function() {
            console.log(e);
        }
    })(i), 1000)  //注意这边callback传入一个自执行函数(闭包),头一回这么见觉得很神奇
}

方案3:es6语法var改成let,当然如果面试遇到相同的问题,面试官一般会排除用es6语法。

另一个闭包问题:

var funcs = [];
for (var i = 0; i < 3; i++) {      
  funcs[i] = function() {          
    console.log( i); 
  };
}
for (var j = 0; j < 3; j++) {
  funcs[j]();                      // 3 3 3
}

解决方案如下:

var funcs = [];

function createfunc(i) {
    return function() { console.log(i); };
}

for (var i = 0; i < 3; i++) {
    funcs[i] = createfunc(i);
}

for (var j = 0; j < 3; j++) {
    funcs[j]();    //0 1 2                 
}

总结

对于for循环等无块级作用域的语句表达式,在循环中的函数引用了所在执行环境中的同一个变量i,i在循环中可变,我们需要的是给循环中的函数传入不同的参数并且这个参数在其所在执行环境中是不可变的。

看了惊鸿三世的JavaScript之闭包与高阶函数,得出了以下结论:

理解并利用闭包需要知道闭包的作用:

  • 封装变量
  • 模仿块级作用域

封装变量

var mult = function() {
        var a = 1;
        for (var i = 0, len = arguments.length; i < len; i++) {
            a = a * arguments[i];
        }
        return a;
    }
    alert(mult(1,2,3,4));

模仿块级作用域

(function() {
        //块级作用域
})()

相关文章

  • 2018-01-07 关于javascript闭包和作用域的理解

    关于 javascript 闭包的一些思考 作用域 词法作用域 函数作用域 块作用域 闭包 什么是作用域? 作用域...

  • 关于闭包的一些思考

    今天知乎看到一个专栏,栏主就面试中的闭包问题吐槽了下现今一些前端从业者。废话不说,进入正题。。。 以上这段代码输出...

  • 闭包介绍

    闭包 关于闭包的定义: A closure is the combination of a function an...

  • 闭包,作用域链,垃圾回收,内存泄露

    1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --《JS高级程序设计...

  • 了解闭包 作用域链 垃圾回收机制

    1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --《JS高级程序设计...

  • 关于闭包

    最近在看JavaScript高程和一些博客的时候对闭包有了更深的认识,关于闭包更像是JavaScript词法作用域...

  • SwiftUI 里的 swift 闭包总结

    创建 UI 时的闭包使用 在 SwiftUI 里闭包出现的频率特别高,这里我重新梳理了下闭包的定义。 关于闭包 闭...

  • JavaScript - 闭包

    理解 关于闭包 答案: 用arguments.callee和闭包实现的函数封装 应用 利用闭包实现自动递增计数

  • 关于Javascript闭包的总结

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

  • Swift5 闭包及其应用

    关于如何理解闭包 学习闭包的第一个难点就是理解闭包,可能很多人用了很久的闭包都还不太清楚闭包到底是什么,我这里提供...

网友评论

      本文标题:关于闭包的一些思考

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