首先声明,记录文章是写给自己的,很多理解可能错误 - -,只是为了方便以后自己理解。。。
文字说明一下什么是静态作用域和动态作用域,静态作用域是在函数声明的时候就已经确定了,而动态作用则要等到函数执行的时候才能确定。
举个栗子
function fn() {
var name = 'xyt'
function getName() {
console.log(name)
}
return {
getName
}
}
var action = fn()
function sayName() {
var name = 'lyc'
action.getName()
}
sayName() //'yxt'
当执行sayName函数的时候会执行getName方法,而getName函数在声明的时候作用域就已经确定了,所以log的name是‘xyt’
作用域链
自己的理解就是向上寻找
栗子
function fn() {
var name = 'xyt'
function getName() {
console.log(name)
}
return {
getName
}
}
为什么会向上寻找呢
当要执行console.log的时候
log函数的执行上下文中没有name变量,就会在getName的执行上下文中寻找(log的执行上下文有引用getName的上下文),要是getName中没有,会到fn()的执行上下文中寻找(getName的执行上下文中有引用fn的上下文,以此类推,直到报undefined)具体涉及到JS执行机制,现在不懂。希望能将其补齐