JavaScript 作用域

Posted 归去来兮-不如去兮

tags:

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

前言:

? 这是每天看github上面的一位大佬 冴羽[的博客 自己加以自己的理解总结的

作用域 是指程序源码中定义变量的区域

作用域决定了如何查找变量,也就是度额定当前执行代码对变量的访问权限

javascript 使用的是 词法作用域 (lexical scoping) 也就是静态作用域

静态作用域与动态作用域

因为JavaScript采用的是词法作用域,函数的作用域在函数定义的时候就决定了

而与词法作用域相对的是动态作用域

函数的作用域是在函数被调用的时候决定的

var value = 1;

function foo() {
    console.log(value);
}

function bar() {
    var value = 2;
    foo();
}

bar();
//这里打印的是什么 1? 2?

静态作用域:

? 执行 foo()函数内部作用域找value 找不到 在全局变量里面找 找到了 打印出 1

动态作用域

? 执行 foo() 函数内部作用域找value 找不到 进入调用函数(bar)作用域 找到了value 打印 2

因为js是静态作用域所以这里是1

这里参照《JavaScript权威指南》 P183

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();

假如理解了JavaScript的静态作用域 可以很轻易的判断出 这里打印的是 ‘局部变量‘ local scope

那么这里我们返回函数内嵌套的一个函数对象 而不是直接返回结果

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

依旧是 "local scope"

JavaScript函数的执行用到了作用域链,这个作用域链是函数定义的时候创建,嵌套的函数f()定义在这个作用域链上面,里面的变量scope一定是局部变量,,不管什么情况下执行f() 局部变量的绑定依旧有效,,因此打印出来依旧是

local scope

下一篇会以执行上下文来解读这段代码 究竟在运行上面什么地方不相同

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

JS---闭包

JS 作用域及作用域链

JS 作用域及作用域链

JavaScript ES6 的let和const

Javascript代码片段在drupal中不起作用

初入AngularJS基础门