javascript标题深入开头文章转自:https://github.com/mqyqingfeng/Blog 文章某些部分可能因为理解不同做一些修改
作用域指对某一变量或方法具有访问权限的代码空间,javascript采用词法作用域,也就是静态作用域。js没有块级作用域。
静态作用域,变量和方法的作用域在定义时就确定了
动态作用域,变量和方法的作用域在运行时才确定
举个例子:
var value = 1; function foo(){ console.log(value); } function bar(){ var value = 2; foo(); } bar(); //结果为1
执行foo函数,函数内部没有局部变量value,就在foo函数定义的上一级查找value=1;
如果是动态作用域,foo函数内部查找不到value变量,就从调用函数的作用域,也就是是bar函数内部查找value变量,所以结果会是2
比如说bash就是动态作用域,把下面脚本存成例如scope.bash,然后执行bash ./scope.bash看看打印值
value=1 function foo () { echo $value; } function bar () { local value=2; foo; } bar
下面是《javascript权威指南》中的例子:
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f(); } checkscope();
var scope = "globle scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f; } checkscope()();
两段代码的结果都是:localscope
原因很简单,javascript采用的是词法作用域,函数的作用域基于函数创建的位置
而引用《javascript权威指南》的回答就是:
javascript函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数f()定义在这个作用域链里,其中的变量scope一定是局部变量,不管何时何地执行函数f(),这种绑定在执行f()时依然有效。
但是这里想让大家思考的是:
虽然两段代码执行的结果一样,但是两段代码究竟有哪些不同?
回答这个问题,要牵涉很多内容,词法作用域只是其中一小部分,请看下篇《深入--执行上下文栈》