执行上下文定义
执行上下文是评估和执行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