wangzhenggui/blog

javaScript深入之静态作用域与动态作用域

Opened this issue · 0 comments

什么叫做作用域

作用域是指程序源代码中定义常量的区域,作用域规定了变量的查找规则,也就是当前执行代码对变量的访问权限

概念

静态作用域: 函数的作用域在函数定义的时候就已经确定了
动态作用域: 函数的作用域在函数调用的时候才能决定
我们通过下面例子的分析来看下javaScript这个语言到底用的是哪一种作用域!!!

var value = 1;
function a() {
	console.log(value);
}

function b() {
	var value = 2;
	a();
}

b(); // 1

1、假设js采用的是动态作用域,那么我们调用b()的时候,b中的value赋值为2,再执行a()的时候,a函数中value就为b函数作用域中的value,应该也为2;
2、假设js采用的是静态作用域,那么a()函数的作用域在定义的时候就已经确定了,那么a()函数中的value先在a函数作用域下查找,没有找到回到函数同级作用域下查找,最后结果应为1;
最后在浏览器中验证的结果是1,说明js采用的是静态作用域(词法作用域)

思考题

例子参考于github上一位大神的例子,例子很鲜明,很好的验证了JS的静态作用域

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

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

通过浏览器分别运行下俩段代码,看看结果与自己预想的一致不一致,如果不一致,可以再看下上面阐述的静态作用域概念!!!

分析: 我们现在知道js采用的是静态作用域,函数作用域取决于函数定义时的位置;通过上面代码我们可以知道最后执行的都是f()这个函数,返回的都是scope这个值,故返回的都是"local scope",其实这里还有一个作用域链的概念,后面文章中会介绍到