Skip to content
New issue

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

闭包 #12

Open
txw2018 opened this issue May 8, 2020 · 0 comments
Open

闭包 #12

txw2018 opened this issue May 8, 2020 · 0 comments

Comments

@txw2018
Copy link
Owner

txw2018 commented May 8, 2020

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全局找,我们把这个查找的链条就称为作用域链

词法作用域

function bar() {
   console.log(name )
}
function foo() {
   var name = "蜡笔小新" 
   bar()
}
var name = "樱桃丸子"
foo()

可以看到全局执行上下文跟foo函数执行上下文都有变量name,我们按照作用域链来分析

1.bar函数内部没有变量,他在foo内部执行,我们去查找 foo函数中的变量

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依然可以用

我们可以用一句话总结:当调用一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了,但是内部函数引用外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant