1.理解闭包咱们首先要了解做用域的问题,简单了解一下做用域,以下做用域的一些结论:闭包
1 函数才会造成做用域 2 JavaScript的做用域是词法做用域 3 词法做用域:变量(变量和函数)的做用范围 在代码写出来的就已经决定, 与运行时无关 4 函数内部能够访问函数外部的变量(函数外部不能访问函数内部的变量) 5 变量搜索原则:从当前链开始查找直到0级链,从高到低查找 当定义了一个函数,当前的做用域链就保存起来,而且成为函数的内部状态的一部分。
闭包从字面上看就是封闭和包裹, 在函数中定义的变量在函数外部没法访问, 所以这个函数就构成闭包。 > 闭包是一个受保护的变量空间。 闭包包括:函数 以及 建立该函数的环境(做用域链)
3.闭包代码抢先看:函数
function foo() { var num = 0; return function() { return num++; };} var getNum = foo();console.log(getNum());
4.要解决闭包的什么问题(目标)?spa
想办法(在外部)访问到函数内部的数据对象
获取函数内部数据ip
函数内部的数据,在函数外面访问不到。作用域
函数对其内部的数据有一个保护的做用。get
5.利用函数返回值io
function foo() { var num = 123; return num;} var num1 = foo();
var num1 = foo();var num2 = foo();console.log(num1 === num2); // true
function foo() { var obj = {num: 123}; return obj;} var o1 = foo();var o2 = foo();console.log(o1 === o2); // false
6.普通的函数返回值说明console
两次调用函数,返回的数据并非同一个数据。 出现这个缘由是:函数在每次调用的时候,函数内部的数据会被新建立一次 要解决这个问题, 只须要保证, 函数 foo 只调用一次便可。
7.闭包模型function
function foo() { var str = "BOSS"; return function() { return str; };} // 调用var f = foo();var str1 = f();var str2 = f();console.log(str1 === str2);
在函数(outer)内部定义的函数(inner),执行的时候能够访问到上一级做用域中的变量。 所以,在函数(outer)外部,就能够间接访问到函数(outer)中的数据了。