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

当面试官说'我们谈谈闭包吧'的时候,我们究竟该谈论些什么? #5

Open
Diazhao opened this issue Feb 14, 2019 · 1 comment

Comments

@Diazhao
Copy link
Owner

Diazhao commented Feb 14, 2019

‘闭包’这个知识点,我们要从何说起

@Diazhao
Copy link
Owner Author

Diazhao commented Feb 14, 2019

  1. 闭包的定义,在红宝书中对闭包的定义是‘能够访问到其他函数作用域的变量的一个函数’
    首先,闭包是一个函数。
    其次,闭包有权利访问其他函数作用域的变量,及时那个函数已经执行完并且返回。
function outerFunc(){
    var count = 2;
    var getCount = function(val){
        count = val;
        console.log(count)
    }
    return getCount;
}
var test = outerFunc();

test(2);
test(4);

正如上面代码表示的一样,outerFunc已经执行完毕,但是由于有闭包的存在,outerFunc函数作用域中的变量值count并没有被释放,而是一直保存了起来。在执行到闭包的时候,一直可以拿到count的值。

  1. 闭包的原理,闭包为什么可以访问到外部函数作用域的值变量?
    这里起主要作用的是JavaScript中的作用域链的概念。
    ‘JavaScript中的函数在定义他们的作用域里运行而不是执行时的作用域’。js中的函数会有一个默认的global作用域。在函数定义时,就会为其分配对用的scope object,这个就决定了运行的时候,函数有权限访问的作用域。这个作用域对象被保存在一个对象中,我们有权访问,修改,但是却无法引用这个对象。
    所以,在函数内部的函数被定义的时候,js编译器就为之创建了这个作用域对象,以至于运行到的时候,就能够访问了。

3.闭包的特点
首先,闭包引用的了外部的变量,即使外部函数执行完了,其中的变量并不会释放,无法被js的垃圾回收机制回收。因此如果大量使用的话,会造成内存溢出。
其次,在es5时代,我们也常用闭包来模拟类的私有变量。

以上是我对闭包的理解。

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