作用域与作用域链:
/**作用域:
* 全局作用域和函数作用域
* 各作用域之间变量名和函数名互不影响
* 查找变量和函数时,先在本作用域查找,如无,则向上一级查找,直至全局作用域
*/
var num1 = 1;
(function () {
var num0 = 0;
console.log(num0); //0 函数作用域内有num0
console.log(num1); //1 函数作用域内无num1,向上一级查找,查找到num1=1
})();
console.log(num1); //1 本作用域(全局作用域)内有num1
console.log(num0); //报错 本作用域内无num0,且已是全局作用域
作用域链:
/**作用域链:
* 层层函数的作用域
* 作用域只能向上查找,不能向下查找
*/
function f0() {
var num0 = 0;
console.log(num0);
f1(); //f0中不可调用f2,f2属于f1的函数作用域
function f1() {
var num1 = 1;
console.log(num0, num1);
f2();
function f2() {
var num2 = 2;
console.log(num0, num1, num2);
}
}
}
f0(); /** 0
* 0 1
* 0 1 2
*/
作用域与执行上下文:
/**作用域与执行上下文:
* 作用域创建于函数定义时,而执行上下文创建于调用函数前
* 作用域静态,创建后一直存在,执行上下文在函数执行结束后被释放
* 执行上下文从属与所在作用域
*/
补充:
/**
* 有三个作用域,全局,func,run
*
*/
var num = 0; //全局作用域的num
function func() {
console.log(num);
}
function run(fun) {
var num = 1;
fun(); //调用函数
}
run(func); //0 func作用域中无num,向上一级即全局作用域查找num
/**
* 三个作用域,全局,func,fun
*/
var func = function () {
console.log(func);
};
func(); //func作用域中无func,向上查找,全局作用域中有func
var obj = {
fun: function () {
console.log(fun); //解决方案,console.log(this.fun);
}
};
obj.fun(); //报错,fun作用域中无fun,向上查找,全局作用域中也无fun