ES6 学习笔记_03(作用链)

作用链

在JavaScript中,函数可以製造一个作用域(函数作用域),如果函数中还有函数那么这个作用域中又会建立一个作用域,将所有的作用域列出来可以获得一个结构,一个函数内指向函数外的链式结构。

而作用链相当于一个物件的链表,如果要找一个变数X,会从这个作用链当前有权限访问的最底层物件开是找,如果这个最底层的物件有X这个变数就直接使用,若没有则会向上层寻找有没有这个变数一直找到作用链的顶部(全域),如果都没有则返回undefined

//全域作用域function f1(){     //一级函式作用域    function f2(){        //二级函式作用域    }}//全域作用域var num = 456;//全域作用域function f3(){    //一级函式作用域    function f4(){        //二级函式作用域    }}

绘製作用链

将全域看成一条线,记为0级链。看全域中有什么成员被宣告(变数、function),若有则以方格形式放在0级链上。看看0级链上的function中是否还有function,若有则0级链上的function中拉出新的链代表1级链。在每一个1级链中重複上面行为,以此类推。

http://img2.58codes.com/2024/20124767fVG3C9v7uj.png

找寻变数的规则

先看需要找的变数目前在第几级链上,看该级别链上是否有指定的变数,若有则可以直接使用。若本级别链上没有找到则往上层找(n-1级链),若有直接使用,没有则再往上层找。若一直往上找值到0级链(全域)都没有该变数则返回undefined。
function f1() {    var num = 123;    function f2() {        console.log(num);     }    f2();}var num = 456;f1();  //123

http://img2.58codes.com/2024/2012476722FgkGAVKv.png

console.log(num)属于2级链,一开始会在同级(2级链)中寻找有没有num这个变数,发现没有后便往上层(1级链)寻找。到1级链中发现有num这个变数则直接使用,于是console出123。

练习

透过上面的介绍,多多少少也了解了作用域与作用域链,在网上找一些题目尝试绘製作用域链图并解答Console的答案。

var num = 123;function f1() {    console.log( num ); }function f2() {    var num = 456;    f1();}f2(); //123

http://img2.58codes.com/2024/20124767ljxl9MarHg.png

在f1(0级链)中的console.log它存在在1级链,虽然在f2中有呼叫f1,但是f1中的console还是存在于1级链中,所以会在1级链中寻找,发现没有符合的对象便往上层(0级链)找。到0级链中找到对应对象,所以输出num = 123。

参考资料 :
JavaScript高级讲义


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章