1、词法作用域(静态作用域)和动态作用域
先看个栗子:
例子1
var value =1;
function foo(){
console.log(value)
}
function bar(){
var value =2;
foo()
}
bar() ==> 输出1 ?2 ?
结果输出打印出来的是:1
那接下来的就是知识点了:
JavaScript采用的是词法作用域,也就是函数的作用域在函数定义时就已经决定好;
相对动态作用域,就是函数的作用域在函数调用时才决定。
过程分析:
执行foo函数,在foo函数内部并没有在找到局部变量value,接着就会查找上一层的代码,找到了value是等于1,而不是获取bar函数内部value=2,因为JavaScript采用的是词法作用域(静态作用域),foo函数在外层定义的时候,作用域就已经决定好了。
同理,假如JavaScript采用的是动态作用域,则会输出的打印结果就会是2了,因为foo函数是在bar函数中被调用,这时候foo函数的作用域包括bar函数内,这样在bar函数内部就能找到变量value。
那接下来再来一个栗子辅助理解
例子2
var scope =“global scope”
function checkscope(){
var scope =“local scope”
function f(){
return scope
}
return f();
}
checkscope() ==>输出是??
输出打印出来的是: local scope
还是因为JavaScript采用的是词法作用域,函数的作用域基于函数的创建位置
总结:
JavaScript函数的执行用到了作用域链,作用域链是在函数定义的时候创建的。这也就是词法作用域的理解关键点。
参考地址:https://github.com/mqyqingfeng/Blog/blob/master/articles