> 知识
作用域和闭包原理(作用域的作用)
导语:作用域和闭包的简单理解
什么是作用域?
“作用域就是一套规则,用于确定在何处以及如何查找变量(标识符)的规则”。在这句话中读到一个关键点 查找变量(标识符),那么就从查找变量说起吧。
function foo() { var a = &39; console.log(a); // 输出}foo()
var a = &39;function foo() { console.log(a); // 输出}foo()
以上两段代码都有在查找变量,第一段代码是在函数中找到a变量,第二段代码是在全局中找到b变量,这就引出了函数作用域和全局作用域
代码2先在函数作用域中查找,没有找到,再去全局作用域中查找,有一个往外层查找的过程。我们好像是顺着一条链条从下往上查找变量,这条链条,我们就称之为作用域链。
作用域中变量(标识符)的查找规则
console.log(ojbs); // 输出undefinedvar ojbs= &39;; 复制代码
console.log(ojbh); // 报错
avaScript是有编译过程的,不要惊讶,真的有!也就是说var ojbs= &39;; 这段代码,其实这是有两个动作的:
编译器在当前作用域中声明一个变量ojbs运行时引擎在作用域中查找该变量,找到了ojbs变量并为其赋值什么是闭包?
闭包就是能够读取其他函数内部变量的函数
function f1() { var n = 1 function f2() { console.log(n) } return f2 } var f2= f1() f2() // 1
上面代码, f2可以读取f1函数内部变量n, f2就是闭包
闭包有什么用?
for (var i = 1; i <= 10; i++) {setTimeout(function () {console.log(i)}, 1000)}
上面代码输出 10次 11
i是声明在全局作用中的,定时器中的匿名函数也是执行在全局作用域中, 如果想要输出1 - 10 怎么办? 让i在每次迭代的时候,都产生一个私有的作用域,在这个私有的作用域中保存当前i的值。
for (var i = 1; i <= 10; i++) {(function (j) {setTimeout(function () {console.log(j)}, 1000)})(i)}
// ES6的let声明,只在块级作用域生效for (let i = 1; i <= 10; i++) {setTimeout(function () {console.log(i)}, 1000)}
实践出真知
function fun(n,o){ console.log(o); return { fun: function(m){ return fun(m,n); } };}var a = fun(0); // ?a.fun(1); // ? a.fun(2); // ?a.fun(3); // ?var b = fun(0).fun(1).fun(2).fun(3); // ?var c = fun(0).fun(1); // ?c.fun(2); // ?c.fun(3); // ?
有谁知道答案的?欢迎留言评论...
本文内容由小冰整理编辑!