變量對(duì)象就是函數(shù)內(nèi)部包含了所有變量和函數(shù)的對(duì)象烟具。
活動(dòng)對(duì)象:函數(shù)內(nèi)部執(zhí)行環(huán)境中包含所有變量和函數(shù)的對(duì)象历恐。
更新:
變量對(duì)象:包含函數(shù)內(nèi)部的所有變量和函數(shù)
活動(dòng)對(duì)象:函數(shù)調(diào)用了,函數(shù)中才會(huì)有活動(dòng)對(duì)象秽荞,否則只有“處于靜止?fàn)顟B(tài)”的變量對(duì)象蛾方,當(dāng)然也沒有創(chuàng)建執(zhí)行環(huán)境。
因此我們可以說變量對(duì)象包含了活動(dòng)對(duì)象上陕,活動(dòng)對(duì)象就是作用域鏈上正在被執(zhí)行和引用的變量對(duì)象桩砰。
// 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();
作用域:
變量的作用域就是變量所在的執(zhí)行環(huán)境(也就是函數(shù)內(nèi)部);函數(shù)的作用域就是定義時(shí)所在的作用域释簿,而不是調(diào)用時(shí)的作用域亚隅。而且變量聲明和函數(shù)聲明都會(huì)被動(dòng)的提升到作用域的頂部。
函數(shù)內(nèi)部定義的變量會(huì)覆蓋改作用域內(nèi)的全局變量庶溶,而且函數(shù)var命令聲明的變量會(huì)提升煮纵,不管在什么位置,變量聲明都會(huì)被提前到函數(shù)內(nèi)的頂部偏螺。例子如下:
var a = 2;
function test(){
console.log(a) //undefined
var a = 4;
console.log(a) //4
}
上面的函數(shù)相當(dāng)于:
var a = 2;
function test(){
var a; //變量提前到函數(shù)頂部
console.log(a) //undefined
a = 4; //變量賦值
console.log(a) //4
}
函數(shù)的作用域:
1行疏、函數(shù)的作用域就是定義時(shí)所在的作用域,而不是調(diào)用時(shí)的作用域
var b = 2;
function test2(){
console.log(b);
}
function fn(){
var b = 4;
test2(); //2
}
fn();
2套像、函數(shù)聲明提前酿联,而且函數(shù)聲明提前的優(yōu)先級(jí)比變量聲明提前高。例子如下:
function testOrder(arg) {
console.log(arg); // arg是形參夺巩,不會(huì)被重新定義
console.log(a); // 因?yàn)楹瘮?shù)聲明比變量聲明優(yōu)先級(jí)高贞让,所以這里a是函數(shù)
var arg = 'hello'; // var arg;變量聲明被忽略, arg = 'hello'被執(zhí)行
var a = 10; // var a;被忽視; a = 10被執(zhí)行柳譬,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
*/