We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mdn的定义:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。
function init() { var name = "蜡笔小新"; // name 是一个被 init 创建的局部变量 function showName() { // displayName() 是内部函数,一个闭包 alert(name); // 使用了父函数中声明的变量 } showName(); } init();
init函数创建了一个name的局部变量和showName的局部函数,showName没有自己的局部变量,所以它会访问外部函数的变量,如果init函数里面也没有name,他就会去window全局找,我们把这个查找的链条就称为作用域链
init
name
showName
function bar() { console.log(name ) } function foo() { var name = "蜡笔小新" bar() } var name = "樱桃丸子" foo()
可以看到全局执行上下文跟foo函数执行上下文都有变量name,我们按照作用域链来分析
foo
1.bar函数内部没有变量,他在foo内部执行,我们去查找 foo函数中的变量
bar
2.我们在foo函数内部找到了name变量,然后使用它
按照这样的查找方式,打印的应该是蜡笔小新,但是结果并非如此,其实打印的是樱桃丸子,要搞清楚这个我们还需要了解词法作用域
蜡笔小新
樱桃丸子
词法作用域
他是根据源代码中声明变量的位置来确定的,所以,其实bar函数的外部引用是全局执行上下文,所以打印出来的是樱桃丸子
了解的作用域链就能更好的理解闭包
function markClosure() { var name = "蜡笔小新"; function showName() { alert(name); } return showName } var myFuc = markClosure(); myFuc()
正常情况下,一个函数中的局部变量仅存在于此函数的执行期间,当函数markClosure一执行完毕之后,name就不能访问了,但是由于JavaScript会形成闭包,当markClosure执行之后showName被返回出去了,由于showName使用了markClosure函数内部的name变量,所以name依然保存在内存中,当我们调用myFuc的时候,name依然可以用
markClosure
myFuc
我们可以用一句话总结:当调用一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了,但是内部函数引用外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
mdn的定义:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。
作用域链
init
函数创建了一个name
的局部变量和showName
的局部函数,showName
没有自己的局部变量,所以它会访问外部函数的变量,如果init
函数里面也没有name
,他就会去window全局找,我们把这个查找的链条就称为作用域链词法作用域
可以看到全局执行上下文跟
foo
函数执行上下文都有变量name
,我们按照作用域链来分析1.
bar
函数内部没有变量,他在foo
内部执行,我们去查找foo
函数中的变量2.我们在
foo
函数内部找到了name
变量,然后使用它按照这样的查找方式,打印的应该是
蜡笔小新
,但是结果并非如此,其实打印的是樱桃丸子
,要搞清楚这个我们还需要了解词法作用域
词法作用域根据源代码中声明变量的位置来确定该变量在何处可用
他是根据源代码中声明变量的位置来确定的,所以,其实
bar
函数的外部引用是全局执行上下文,所以打印出来的是樱桃丸子闭包
了解的作用域链就能更好的理解闭包
正常情况下,一个函数中的局部变量仅存在于此函数的执行期间,当函数
markClosure
一执行完毕之后,name
就不能访问了,但是由于JavaScript会形成闭包,当markClosure
执行之后showName
被返回出去了,由于showName
使用了markClosure
函数内部的name
变量,所以name
依然保存在内存中,当我们调用myFuc
的时候,name
依然可以用我们可以用一句话总结:当调用一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了,但是内部函数引用外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包。
The text was updated successfully, but these errors were encountered: