美文网首页
深入之作用域及作用域链

深入之作用域及作用域链

作者: 明里人 | 来源:发表于2019-07-13 15:12 被阅读0次

JS运行三部曲
1、语法分析
2、预编译
3、解析执行
预编译:

对于函数,执行上下文四部曲:
· 1、创建AO对象,
· 2、找到形参和变量声明,将变量和形参名作为AO属性名,值为undefined
· 3、将形参值和实参相统一
· 4、在函数体内找函数声明,将函数提升至最顶层(如果已有定义的相同的属性名,则完全替换这个属性)。

作用域(静态作用域)

作用域是指程序源代码中定义变量的区域。
JavaScript采用词法作用域,也就是静态作用域。所以函数的作用域在定义的时候就决定了。

看一个例子:

var value = 1;
function foo(){
  console.log(value);
}
function bar(){
  var value = 2;
  foo();
}
bar();  // 1

静态作用域执行过程:
执行foo函数,先从foo函数内部查找是否有局部变量value,如果没有,就根据定义foo函数的位置,查找上面一层的代码,也就是value 等于1,所以会打印1。

动态作用域执行过程:
执行foo函数,先从foo函数内部查找是否有局部变量value,如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value,所以会打印2。

思考
var scope = 'global scope';
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
console.log(checkscope());
var scope = 'global scope';
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
console.log(checkscope()());

这两段代码都会打印:local scope。

因为JavaScript采用的是词法作用域,函数向上访问的作用域,基于函数创建的位置,而不是函数调用的位置。

作用域链

当一个块级作用域或函数嵌套在另一个块或函数中时,就发生了作用域嵌套。因此,在当前作用域中无法搜索到某个变量时,JS引擎就会向外层( 父级 )作用域中查找,直到搜索到该变量,或者抵达最外层作用域( 也就是全局作用域 ),形成了作用域链。

var scope = 'global';
function fun(){
    var value = 12;
    function fun1(){
        var name = 'cyl'
        console.log(name);  // cyl  
        console.log(value);  // 12
        console.log(scope);  // global
    }
    return fun1();
}
fun();

相关文章

  • JavaScript深入系列的学习(一)

    JavaScript深入之从原型到原型链JavaScript深入之词法作用域和动态作用域JavaScript深入之...

  • 深入理解闭包(五)——作用域、作用域链和执行上下文

    原文地址:深入理解闭包(五)——作用域、作用域链和执行上下文 作用域,作用域链,执行上下文三者之间有着密切的关系,...

  • 深入之作用域及作用域链

    JS运行三部曲1、语法分析2、预编译3、解析执行预编译: 对于函数,执行上下文四部曲:· 1、创建AO对象,· 2...

  • 作用域链和闭包

    在谈作用域链之前先说一下与作用域链关系紧密的执行环境和作用域。 作用域:作用域指的是变量的适用范围。 作用域链:作...

  • JavaScript 作用域链及闭包

    作用域链及闭包

  • 作用域及作用域链

    变量作用域 在 JavaScript 中全局变量的作用域是全局的,在代码的任何地方都是有定义的。然而函数的参数和局...

  • 作用域及作用域链

    作用域在JS中是一个很重要的概念,如下是我的理解: 作用域 作用域是变量或者函数可以访问的范围,即作用域控制着变量...

  • 作用域及作用域链

    [[scope]]: 每个JavaScript函数都是一个对象,对象中有些属性我们可以访问,有些不可以,这些属性仅...

  • web性能实践

    一. 作用域 前面我们了解作用域概念的以及作用域链是如何运作的。 随着作用域链中的作用域数量的增加,访问当前作用域...

  • JS博客

    JS构造函数及new运算符 JS原型对象和原型链 函数作用域和作用域链 干货分享:让你分分钟学会JS闭包 深入理解...

网友评论

      本文标题:深入之作用域及作用域链

      本文链接:https://www.haomeiwen.com/subject/otspkctx.html