资讯专栏INFORMATION COLUMN

javascript 词法作用域

mtunique / 720人阅读

摘要:词法作用域定义在词法阶段的作用域,开始时,编译器做语法分析的时候,确认里各个词法所在的作用域。例如等函数可以理解为在当前作用域插入一段代码。扩展一个语句的作用域链。

词法作用域
定义在词法阶段的作用域,开始时,编译器做语法分析的时候,确认js里各个词法所在的作用域。

js里只有全局作用域和函数作用域,这里简单介绍下js的作用域。

js作用域

看下面代码:

        var a = 1;
        var b = 0;

        function foo() {
            var a = 2;
            console.log(a); //2
            console.log(b); //0
        }
        foo();
        console.log(a); //1

1、在foo函数里,在console.log(a),对a进行RHS查询,发现在当前作用域存在变量a,如果foo里没有a就往上一层(全局)去查找
2、在foo函数里,在console.log(b),对b进行RHS查询,发现在当前作用域不存在变量b,然后往上一层(全局)去查找b,发现存在变量b,获取b的值。

在词法分析阶段,会确认在全局作用域里有a,b这两个变量,函数foo作用域里有a这个变量

但是,有些方法可以欺骗或者动态生成作用域。

例如:eval、setTimeout、with等

eval

eval函数可以理解为在当前作用域插入一段代码。

如下:

        var b = 2;

        function foo() {

            eval("var b=1")

            console.log(b); //1
        }

        foo();
        console.log(b); //2

在开始的词法分析中,foo函数作用域并不存在变量b,然而在引擎执行代码的时候,到eval函数执行,就强行在foo函数作用域中插入变量b

setTimeout

定时器函数是一个异步函数,第一个参数中字符串的执行作用域是全局作用域,类似上面动态插入变量。

        var b = 1;

        function foo() {

            setTimeout("var b =2", 0);
            setTimeout("console.log(b)", 0); //2
        }
        foo();
        console.log(b); //1

with

扩展一个语句的作用域链。

在一个对像是扩展属性,如果属性存在就修改属性值,如果不存在就挂载在全局对象上,类似于在函数里不用var声明的变量都挂在window对象上。

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

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

相关文章

  • 还担心面试官问闭包?

    摘要:一言以蔽之,闭包,你就得掌握。当函数记住并访问所在的词法作用域,闭包就产生了。所以闭包才会得以实现。从技术上讲,这就是闭包。执行后,他的内部作用域并不会消失,函数依然保持有作用域的闭包。 网上总结闭包的文章已经烂大街了,不敢说笔者这篇文章多么多么xxx,只是个人理解总结。各位看官瞅瞅就好,大神还希望多多指正。此篇文章总结与《JavaScript忍者秘籍》 《你不知道的JavaScri...

    tinyq 评论0 收藏0
  • JavaScript深入之词法作用和动态作用

    摘要:作用域作用域是指程序源代码中定义变量的区域。采用词法作用域,也就是静态作用域。而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。前面我们已经说了,采用的是静态作用域,所以这个例子的结果是。 JavaScript深入系列的第二篇,JavaScript采用词法作用域,什么语言采用了动态作用域?两者的区别又是什么?还有一个略难的思考题,快来看看吧。 作用域 作用域是指...

    gclove 评论0 收藏0
  • 重读你不知道的JS (上) 第一节二章

    摘要:词法作用域定义在词法阶段的作用域由你在写代码时将变量和块作用域写在哪来决定的,因此当词法分析器处理代码时会保持作用域不变。欺骗词法作用域在词法分析器处理过后依然可以修改作用域。 你不知道的JS(上卷)笔记 你不知道的 JavaScript JavaScript 既是一门充满吸引力、简单易用的语言,又是一门具有许多复杂微妙技术的语言,即使是经验丰富的 JavaScript 开发者,如果没...

    baihe 评论0 收藏0
  • 十分钟快速了解《你不知道的 JavaScript》(上卷)

    摘要:最近刚刚看完了你不知道的上卷,对有了更进一步的了解。你不知道的上卷由两部分组成,第一部分是作用域和闭包,第二部分是和对象原型。附录词法这一章并没有说明机制,只是介绍了中的箭头函数引入的行为词法。第章混合对象类类理论类的机制类的继承混入。 最近刚刚看完了《你不知道的 JavaScript》上卷,对 JavaScript 有了更进一步的了解。 《你不知道的 JavaScript》上卷由两部...

    赵春朋 评论0 收藏0
  • [JS]《你不知道的Javascript·上》——词法作用和闭包

    摘要:吐槽一下,闭包这个词的翻译真是有很大的误解性啊要说闭包,要先说下词法作用域。闭包两个作用通过闭包,在外部环境访问内部环境的变量。闭包使得函数可以继续访问定义时的词法作用域。 闭包是真的让人头晕啊,看了很久还是觉得很模糊。只能把目前自己的一些理解先写下来,这其中必定包含着一些错误,待日后有更深刻的理解时再作更改。 吐槽一下,闭包这个词的翻译真是有很大的误解性啊…… 要说闭包,要先说下词法...

    guqiu 评论0 收藏0
  • 深入理解 Javascript作用

    摘要:作用域是门动态语言,跟不一样,可以随意定义全局变量和局部变量,变量会在该作用域下提升,而且没有块级作用域。一预处理作用域解析的作用域只用两种,一个是全局的,一个是函数的,也称为全局作用域和局部作用域局部作用域可以访问全局作用域。 作用域 JavaScript是门动态语言,跟Java不一样,JavaScript可以随意定义全局变量和局部变量,变量会在该作用域下提升,而且JavaScrip...

    banana_pi 评论0 收藏0

发表评论

0条评论

mtunique

|高级讲师

TA的文章

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