变量对象就是函数内部包含了所有变量和函数的对象。
活动对象:函数内部执行环境中包含所有变量和函数的对象。
更新:
变量对象:包含函数内部的所有变量和函数
活动对象:函数调用了,函数中才会有活动对象,否则只有“处于静止状态”的变量对象,当然也没有创建执行环境。
因此我们可以说变量对象包含了活动对象,活动对象就是作用域链上正在被执行和引用的变量对象。
// var color = "blue";
// function changeColor(){
// var anotherColor = "red";
// function swapColors(){
// var tempColor = anotherColor;
// alert(tempColor); //red
// anotherColor = color;
// alert(tempColor); //red
// color = tempColor;
// alert(tempColor); //red
// }
// swapColors();
// }
// changeColor();
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
alert(tempColor); //red
anotherColor = color;
alert(anotherColor); //blue
color = tempColor;
alert(color); //red
}
swapColors();
}
changeColor();
作用域:
变量的作用域就是变量所在的执行环境(也就是函数内部);函数的作用域就是定义时所在的作用域,而不是调用时的作用域。而且变量声明和函数声明都会被动的提升到作用域的顶部。
函数内部定义的变量会覆盖改作用域内的全局变量,而且函数var命令声明的变量会提升,不管在什么位置,变量声明都会被提前到函数内的顶部。例子如下:
var a = 2;
function test(){
console.log(a) //undefined
var a = 4;
console.log(a) //4
}
上面的函数相当于:
var a = 2;
function test(){
var a; //变量提前到函数顶部
console.log(a) //undefined
a = 4; //变量赋值
console.log(a) //4
}
函数的作用域:
1、函数的作用域就是定义时所在的作用域,而不是调用时的作用域
var b = 2;
function test2(){
console.log(b);
}
function fn(){
var b = 4;
test2(); //2
}
fn();
2、函数声明提前,而且函数声明提前的优先级比变量声明提前高。例子如下:
function testOrder(arg) {
console.log(arg); // arg是形参,不会被重新定义
console.log(a); // 因为函数声明比变量声明优先级高,所以这里a是函数
var arg = 'hello'; // var arg;变量声明被忽略, arg = 'hello'被执行
var a = 10; // var a;被忽视; a = 10被执行,a变成number
function a() {
console.log('fun');
} // 被提升到作用域顶部
console.log(a); // 输出10
console.log(arg); // 输出hello
};
testOrder('hi');
/* 输出:
hi
function a() {
console.log('fun');
}
10
hello
*/