欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript 作用域

程序员文章站 2022-04-24 13:10:28
前言: ​ 这是每天看github上面的一位大佬 "冴羽" [的博客 自己加以自己的理解总结的 是指程序源码中定义变量的区域 作用域决定了如何查找变量,也就是度额定当前执行代码对变量的访问权限 JavaScript 使用的是 (lexical scoping) 也就是静态作用域 静态作用域与动态作用 ......

前言:

​ 这是每天看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

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