JavaScript闭包

JavaScript最有意思的就是闭包,很简单,闭包的出现就是解决变量作用域的问题

看看这个例子

for (var i = 0; i < 2; i++) {
  (function(n){
    console.log(n);
  })(i)
}

// Output:
//  0
//  1

以上例子就是需要在for循环中能够接收到每一个变量,于是有些朋友就说了,直接console.log不就好了吗?

for (var i = 0; i < 2; i++) {
  console.log(i);
}

// Output:
//  0
//  1

其实,以上也能正确打印出来,那是因为代码还没有遇到异步执行的情况,当你需要异步执行又要需要过程环境变量

for (var i = 0; i < 2; i++) {
  setTimeout(function(){
    console.log(i);
  }, 2000)
}

// Output:
//  2
//  2

两次打印的都是i,因为异步执行了console.log语句,而最后当执行到console.log时i的变量就是2,如果你想在console.log打印时是过程中的变量,就要使用闭包了

for (var i = 0; i < 2; i++) {
  (function(n){
    setTimeout(function(){
      console.log(n);
    }, 2000)
  })(i)
}

// Output:
//  0
//  1

当然,我不推荐滥用闭包,那会使得程序不容易维护,比如以上例子可以这么简单实现

var say = function(i) {
  setTimeout(function(){
    console.log(i)
  }, 2000)
}
for (var i = 0; i < 2; i++) {
  say(i)
}

// Output:
//  0
//  1

以上方式就是定义了一个say()方法来解决过程变量的问题

分享

TITLE: JavaScript闭包

LINK: https://www.qttc.net/154-javascript-closure.html

NOTE: 原创内容,转载请注明出自琼台博客