javascript ?原型、作用域鏈,講解的很好,能學會學懂
1.1 函數(shù)作用域
沒有塊作用域:即作用域不是以{}包圍的,其作用域完成由函數(shù)來決定,因而if /for等語句中的花括號不是獨立的作用域。
如前述,JS的在函數(shù)中定義的局部變量只對這個函數(shù)內(nèi)部可見,稱之謂函數(shù)作用域。
嵌套作用域變量搜索規(guī)則:當在函數(shù)中引用一個變量時,JS會搜索當前函數(shù)作用域,如果沒有找到則搜索其上層作用域,一直到全局作用域。
函數(shù)內(nèi)無論什么位置定義的局部變量,在進入函數(shù)時都是已經(jīng)定義的,但未初始化,即為undefined,直到運行到變量被賦值時才被初始化,因此若訪問了未初始化的變量,我們會得到undefined的說明。
b)js里面只有函數(shù)作用域,以及全局作用域,
3 對象
在基于類型的語言中,對象是由類實例化,而JS是基于原型的系統(tǒng),對象是由原型復制生成的。
JS中有兩個特殊的對象:Object與Function,它們都是構造函數(shù),用于生成對象。注意此處的Function 函數(shù)是大寫的,函數(shù)對象
判斷一個變量是不是對象非常簡單。值類型的類型判斷用typeof,引用類型的類型判斷用instanceof。
一切(引用類型)都是對象,對象是屬性的集合
functionFn() {this.name = '王福朋';this.year = 1988;
}varfn1 =newFn();
上面的這個例子很簡單,它能說明:對象可以通過函數(shù)來創(chuàng)建。對!也只能說明這一點。
對象都是通過函數(shù)來創(chuàng)建的
functionFn() { }
Fn.prototype.name= '王福朋';
Fn.prototype.getYear=function() {return1988;
};varfn =newFn();
console.log(fn.name);
console.log(fn.getYear());
Fn是一個函數(shù),fn對象是從Fn函數(shù)new出來的,這樣fn對象就可以調(diào)用Fn.prototype中的屬性。
這個prototype的屬性值是一個對象(屬性的集合,再次強調(diào)!),默認的只有一個叫做constructor的屬性,指向這個函數(shù)本身。
如上圖,SuperType是是一個函數(shù),右側的方框就是它的原型。
JavaScript 原型鏈和作用域的講解,已經(jīng)明白
http://www.cnblogs.com/wangfupeng1988/p/3977924.html
在一段js代碼拿過來真正一句一句運行之前,瀏覽器已經(jīng)做了一些“準備工作”,其中就包括對變量的聲明,而不是賦值。變量賦值是在賦值語句執(zhí)行的時候進行的。可用下圖模擬:
“準備工作”介紹完畢。
我們總結一下,在“準備工作”中完成了哪些工作:
變量、函數(shù)表達式——變量聲明,默認賦值為undefined;
this——賦值;
函數(shù)聲明——賦值;
這三種數(shù)據(jù)的準備情況我們稱之為“執(zhí)行上下文”或者“執(zhí)行上下文環(huán)境”。
函數(shù)每被調(diào)用一次,都會產(chǎn)生一個新的執(zhí)行上下文環(huán)境。因為不同的調(diào)用可能就會有不同的參數(shù)。
函數(shù)在定義的時候(不是調(diào)用的時候),就已經(jīng)確定了函數(shù)體內(nèi)部自由變量的作用域。
給執(zhí)行上下文環(huán)境下一個通俗的定義——在執(zhí)行代碼之前,把將要用到的所有的變量都事先拿出來,有的直接賦值了,有的先用undefined占個空
在函數(shù)中this到底取何值,是在函數(shù)真正被調(diào)用執(zhí)行的時候確定的,函數(shù)定義的時候確定不了
因為this的取值是執(zhí)行上下文環(huán)境的一部分,每次調(diào)用函數(shù),都會產(chǎn)生一個新的執(zhí)行上下文環(huán)境
執(zhí)行全局代碼時,會產(chǎn)生一個執(zhí)行上下文環(huán)境,每次調(diào)用函數(shù)都又會產(chǎn)生執(zhí)行上下文環(huán)境。當函數(shù)調(diào)用完成時,這個上下文環(huán)境以及其中的數(shù)據(jù)都會被消除,再重新回到全局上下文環(huán)境。處于活動狀態(tài)的執(zhí)行上下文環(huán)境只有一個。
作用域中變量的值是在執(zhí)行過程中產(chǎn)生的確定的,而作用域卻是在函數(shù)創(chuàng)建時就確定了
要到創(chuàng)建這個函數(shù)的那個作用域中取值——是“創(chuàng)建”,而不是“調(diào)用”,切記切記——其實這就是所謂的“靜態(tài)作用域”。