深入理解 JavaScript 执行上下文和执行栈
函数上下文有变量提升的概念:但提升的只是声明
console.log(b in window)
if (false){
var b=1;
}
console.log(b);
#变量提升在函数提升前面,因此,如果函数和变量用同一个变量名,函数会将变量覆盖
function a() {
}
var a;
console.log(typeof a);
作用域和执行上下文
1. 全局作用域和函数作用域
区别一:
1) 作用域:全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了,而不是在函数调用时
var x = 10;
function fn() {
console.log(x);
}
function show(f) {
var x = 20;
f();
}
show(fn) ; //10
2)执行上下文是动态的,只要函数定义好了就一直存在,且不会再变化
全局执行上下文是在全局作用域确定之后,js代码马上执行之前创建
函数执行上下文是在调用函数时,函数体代码执行之前创建
联系:
上下文环境从属于所在的作用域
全局上下文从属于全局作用域
函数上下文从属于函数作用域
var fn = function () {
console.log(fn);
}
fn();
var obj = {
fun2:function () {
console.log(fn2)
}
};
obj.fun2 = function () {
console.log(fn2)
}; //当前函数作用域没有fn2, 去全局查找;
obj.fn2();