理解执行上下文和作用域

140 阅读2分钟

执行上下文定义

执行上下文是评估和执行JavaScript代码环境的抽象概念。JavaScript代码都是在执行上下文中运行的。变量或者函数的上下文决定了它们的行为。

执行上下文类型

  • 全局执行上下文:是最外层的上下文,任何不在函数内的代码都在全局上下文中。也就是常说的window对象。因此使用var定义的全局变量和函数都会成为window对象的属性和方法。全局上下文在应用程序推出前才会被销毁。全局上下文的变量对象始终是作用域链的最后一个变量对象。

  • 函数执行上下文:每个函数被调用时,都会创建一个该函数的执行上下文。

  • Eval函数执行上下文:不经常使用,不需要学习。

上下文的代码在执行的时候会创建一个作用域链。内部上下文可以通过作用域链访问外部上下文的一切,但外部上下文无法访问内部上下文中的任何东西。每个上下文都可以到上一级上下文中去搜索变量和函数,但任何上下文都不能到下一级上下文中去搜索。

var color = "blue"

function changeColor() {
    let anotherColor = "red"
    
    function swapColors(){
        let tempColor = anotherColor
        anotherColor = color
        color = tempColor
        //这里可以访问color,anotherColor和tempColor
    }
    //这里可以访问color和anotherColor,但访问不到tempColor
    swapColors()
}
// 这里只能访问到color
changeColor()

变量声明

let

let与var很相似,但是let的作用域是块级的(块级作用域由最近的一对{}界定)。

if(true){
    let a
}
console.log(a)  //ReferenceError:a没有定义

let非常时合在循环中声明迭代变量

const

使用const必须同时初始化为某个值,声明之后在其生命周期的任何时候都不能再重新赋值

如果想让整个对象都不能修改,可以使用Object.freeze(),这样再给属性赋值时虽然不会报错,但会静默失败

const o3 = Object.freeze({})
o3.name = 'Jack'
console.log(o3.name) //undefined