作用域链的理解
1可以把作用域链理解成是一个栈结构;
2每个作用域都有一个作用域对象用于保存在该作用域内创建的变量(包括函数),其保存的方式是:在作用域内创建的变量会成为作用域对象的属性;
3作用链链保存的是各级作用域对象的引用,其中最近的作用域的作用域对象在最前端,越远的作用域的作用域对象越靠后;
4全局作用域的作用域对象是全局对象本身;所以,每个作用域链的最后端都是全局对象的引用;
5在全局作用域内创建的变量会成为全局对象的属性的原因:由于2(在作用域内创建的变量会成为作用域对象的属性)和4(全局作用域的作用域对象是全局对象本身),所以在全局作用域创建的变量会成为全局对象的属性;
6函数的作用域链是在函数对象被创建时(被定义时)创建的;
7每当函数被执行时,都会新创建一个函数的作用域对象,并把该作用域对象推到作用域链的最前端;
8每当函数执行结束时,都会把函数的作用域对象从该函数作用链中推出;
闭包的本质
其实闭包携带外部变量的机制并非闭包的特有机制,它是函数的作用域链的一个效应;在JavaScript中,闭包和普通函数没有任何本质的区别,闭包只是函数在某种使用场景下的一个名字,就好比凶器只是刀在用于行凶时的名字;
JavaScript中的闭包能携带外部变量的原因是:
JavaScript的函数在被创建时(被定义时)会生成自己的作用域链;该作用域链会保存各级作用域对象的引用,所以JavaScript的函数能够访问其外部的所有变量;上下文执行栈在创建的时候是一层一层的堆上去的
网友评论