【每日笔记 · 2】作用域闭包经典题解

173 阅读1分钟

1. 闭包

当函数可以记住并访问所在词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。

function foo(){
    var a = 2;
    function bar(){ // 能够访问foo()的内部作用域
        console.log(a);
    }
    return bar;
}
var baz = foo(); // bar 在自己定义的词法作用域以外的地方执行,依然能访问foo()内部作用域
baz(); // 2 

2.经典题解

1. 循环计数(非闭包)

var data = [];

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

data[0](); // 3
data[1](); // 3
data[2](); // 3

自己的理解:

var data = [];
var i; // 变量提升,i为全局变量

for (i = 0; i < 3; i++) {
  data[i] = function () {
    console.log(i);
  }; // 将匿名函数赋值给变量
}
// 执行函数时,i为全局变量,此时已经循环完毕,i的值为3
data[0](); // 3 
data[1](); // 3
data[2](); // 3

2. 循环计数(闭包)

var data = [];

for (var i = 0; i < 3; i++) {
  data[i] = (function (i) {
        return function(){
            console.log(i);
        }
  })(i);
}

data[0](); // 0
data[1](); // 1
data[2](); // 2

自己的理解:

var data = [];

for (var i = 0; i < 3; i++) {
  data[i] = (function (i) {
        return function(){
            console.log(i);
        } // 将函数返回,可以在作用域外执行,产生闭包,记住此时的词法作用域
  })(i); // 闭包,可以记住并访问所在词法作用域
}

data[0](); // 0
data[1](); // 1
data[2](); // 2