资讯专栏INFORMATION COLUMN

深入理解JavaScript (4) —— 从自由变量到作用域链

LittleLiByte / 3379人阅读

摘要:自由变量如果在某个作用域中使用了变量,而变量并未在该作用域中声明在其它作用域中声明了,则该变量即为自由变量。换言之,此处最终执行的函数是,而自由变量是,因此要到创建的作用域中去找的值。

自由变量:如果在某个作用域中使用了变量“a”,而变量“a”并未在该作用域中声明(在其它作用域中声明了),则该变量“a”即为自由变量。

var a = 1;
function fn() {
    var b = 2;
    console.log( a + b);    //变量a即为一个自由变量
}

上述代码中,取b的值就直接可以在fn作用域中取,因为b就是在这里定义的。而取x的值时,就需要到另一个作用域中取。到哪个作用域中取呢?

有人说,要到父作用域中取,其实有时候这种解释会产生歧义。例如:

var a = 1;
function fn() {
    console.log(a);
}

function show(f) {
    var a = 2;
    (function () {
        f();    //1,而不是2
    })();
}

show(fn);

上述代码的执行结果说明“要到父作用域中取”这句话并不准确,更贴切的说法是:要到创建这个被执行函数(此处为fn)的那个作用域(此处为全局作用域,因为fn是在全局作用域中创建的)中取值 是“创建”,而不是“调用”,切记切记——其实这就是所谓的“静态作用域”。换言之,此处最终执行的函数是fn,而自由变量是a,因此要到创建fn的作用域中去找a的值。

存在这样的可能,在创建fn的作用域中并未找到自由变量a,此时怎么办呢?那就再到该作用域的上一级作用域中寻找,如若还没有,就继续向上找,直至找到全局作用域,若依然未找到,就会报“a is not defined!”。能够沿着作用域一级级向上寻找的机制就称为“作用域链”。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91724.html

相关文章

  • 【进阶2-2期】JavaScript深入作用域链理解闭包

    摘要:使用上一篇文章的例子来说明下自由变量进阶期深入浅出图解作用域链和闭包访问外部的今天是今天是其中既不是参数,也不是局部变量,所以是自由变量。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周正式开始前端进阶的第二期,本周的主题是作用域闭包,今天是第7天。 本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计...

    simpleapples 评论0 收藏0
  • javascript深入理解-作用域链理解闭包

    摘要:一概要红宝书对于闭包的定义闭包就是有权访问另外一个函数作用域中变量的函数。汤姆大叔在关于闭包对的文章的定义。解决办法改成闭包,方法就是返回一个函数,并且访问变量循环结束后的全局执行上下文没有变化。 一、概要 红宝书(P178)对于闭包的定义:闭包就是有权访问另外一个函数作用域中变量的函数。 MDN,对于闭包的定义:闭包就是指能够访问自由变量的函数。 那么什么是自由变量?自由变量就是在函...

    Scholer 评论0 收藏0
  • JavaScript中的闭包

    摘要:闭包引起的内存泄漏总结从理论的角度将由于作用域链的特性中所有函数都是闭包但是从应用的角度来说只有当函数以返回值返回或者当函数以参数形式使用或者当函数中自由变量在函数外被引用时才能成为明确意义上的闭包。 文章同步到github js的闭包概念几乎是任何面试官都会问的问题,最近把闭包这块的概念梳理了一下,记录成以下文章。 什么是闭包 我先列出一些官方及经典书籍等书中给出的概念,这些概念虽然...

    HmyBmny 评论0 收藏0
  • 深入理解JavaScript作用域和作用域链

    前言 JavaScript中有一个被称为作用域(Scope)的特性。虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 想阅读更多优质文章请猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见...

    baiy 评论0 收藏0
  • 深入理解JavaScript作用域和作用域链

    前言 JavaScript中有一个被称为作用域(Scope)的特性。虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 想阅读更多优质文章请猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见...

    ytwman 评论0 收藏0

发表评论

0条评论

LittleLiByte

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<