理解JS词法(静态)作用域和作用域链

191 阅读1分钟

首先声明,记录文章是写给自己的,很多理解可能错误 - -,只是为了方便以后自己理解。。。

文字说明一下什么是静态作用域和动态作用域,静态作用域是在函数声明的时候就已经确定了,而动态作用则要等到函数执行的时候才能确定。

举个栗子

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执行机制,现在不懂。希望能将其补齐