作用域

Posted Infogami

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作用域相关的知识,希望对你有一定的参考价值。

一,作用域定义

定义变量的区域,作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。
因为采用词法作用域,函数的作用域在函数定义的时候就决定了。
与词法作用域相对的是动态作用域,函数的作用域在函数调用的时候才决定。

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

⑴采用用词法作用域:读取foo函数时,会先确定被访问变量的;从当前函数作用中找value变量,没有则往上层对象中去找。按这个逻辑怎找到全局变量value=1;所以执行foo函数时,value=1。
⑵采用动态作用域:执行foo函数时,才会去寻找value变量;依然是从foo函数内部查找是否有局部变量value。如果没有,就从调用函数的作用域,也就是bar函数内部查找value变量,所以最后会打印2

二,js作用域

ECMAScript6之前只有全局作用域和函数作用域。之后引入看了块级作用域。

三,留下一个《javascript权威指南》中的例子
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();
四,不要在块级作用域里面声明函数
  • Chrome运行分析

    var a
    if(true){ // 断点 Scope Global  a: undefined
        a = 5 
        // Call Stack 进入anonymous   
        // Scope 
            // Block   a: function a(){}  在 if 的块级作用域 中 a 被提升为一个函数 并赋值
            //Global  a: undefined
        function a() {};
        // 执行到这儿的时候 块内的a 被赋值为5
        // Scope 
            // Block   a: 5  在 if 的块级作用域 中 a 被赋值为 5
            // global a: undefined
        a= 0
        // 执行到这儿的时候 
        // Scope 
            // Block   a: 5  在 if 的块级作用域 中 a 被赋值为 5
            // global a: 5
        console.log(a)
         // Scope 
            // Block   a: 0  在 if 的块级作用域 中 a 被赋值为 5
            // global a: 5
        // 此时在if 块级的作用域内的a 为0  Block 0  console.log(会立即执行) 输出0
    }
    console.log(a)

    看下mdn的建议

  • 不同浏览器下的测试结果

    var hoisted = "foo" in this
    console.log(`foo name:${foo?\'ascension\':\'not be ascension\'},typeof foo:${typeof foo}`)
    if(false){
        function foo(){ return 1 }
    }
    //Chrome中,\'foo\'变量被提升,但typeof 为undefined
    
    //Firefox中,\'foo\'变量被提升,但typeof 为undefined
    
    //Edge中,\'foo\'变量未被提升,但typeof 为undefined
    
    //Safari中,\'foo\'变量被提升,但typeof 为function
    
    //即使把上面条件改成false也是一样,这是历史遗留的问题

以上是关于作用域的主要内容,如果未能解决你的问题,请参考以下文章

JS 作用域及作用域链

作用域是什么?

JavaScript 作用域 与 作用域链

JS---闭包

angularjs作用域之transclude

Python - 模块