-
作用域链
2021-02-23 09:36:16什么是作用域链? 当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。 可以说我们在执行上下文中访问到的父级甚至全局的变量,都是作用域链的功劳。 作用域链理解为一组对象列表,包含父级和自身的...什么是作用域链?
当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。
可以说我们在执行上下文中访问到的父级甚至全局的变量,都是作用域链的功劳。
作用域链理解为一组对象列表,包含父级和自身的变量对象,因此可通过作用域链访问到父级里的变量和函数。
作用域链特性?
当函数执行时,总是先从函数内部寻找局部变量。
如果内部找不到(函数的局部作用域没有),则会想创建函数的作用域(声明函数的作用域)寻找,以此向上。
var a = 1; function fn () { var a = 10; function fn1 () { var a = 20; console.log(a);//20 } function fn2 () { console.log(a);//10 } fn1(); fn2(); } fn();//1
解析:当执行fn1的时候,创建函数fn1的执行环境,并将该对象置于链表开头,然后将函数fn的调用对象放到第二位,最后是全局对象,作用域链的链表结构是fn1->fn->window。
从链表的开头寻找变量a,即fn1函数内部找变量a,找到了,结构是20。
同样,执行fn2时,作用域链的链表的结构是fn2->fn->window。从链表的开头寻找变量a,即fn2函数内部找变量a,找不到,预算从fn内部找变量a,找到了,结果是10。
最后在最外层打印出变量a,直接从变量a的作用域即全局作用域内寻找,结果为1。
收藏数
11,013
精华内容
4,405