javascript 词法作用域

词法作用域

定义在词法阶段的作用域,最先时,编译器做语法剖析的时刻,确认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对象上。

    原文作者:NicolaChin
    原文地址: https://segmentfault.com/a/1190000013755719
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞