前言:
这是每天看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
下一篇会以执行上下文来解读这段代码 究竟在运行上面什么地方不相同