javascript ?原型预柒、作用域鏈,講解的很好毯焕,能學(xué)會學(xué)懂
1.1 函數(shù)作用域
沒有塊作用域:即作用域不是以{}包圍的矫废,其作用域完成由函數(shù)來決定,因而if /for等語句中的花括號不是獨立的作用域绪穆。
如前述辨泳,JS的在函數(shù)中定義的局部變量只對這個函數(shù)內(nèi)部可見,稱之謂函數(shù)作用域玖院。
嵌套作用域變量搜索規(guī)則:當(dāng)在函數(shù)中引用一個變量時菠红,JS會搜索當(dāng)前函數(shù)作用域,如果沒有找到則搜索其上層作用域难菌,一直到全局作用域试溯。
函數(shù)內(nèi)無論什么位置定義的局部變量,在進入函數(shù)時都是已經(jīng)定義的郊酒,但未初始化遇绞,即為undefined键袱,直到運行到變量被賦值時才被初始化,因此若訪問了未初始化的變量摹闽,我們會得到undefined的說明蹄咖。
b)js里面只有函數(shù)作用域,以及全局作用域,
3 對象
在基于類型的語言中,對象是由類實例化付鹿,而JS是基于原型的系統(tǒng)澜汤,對象是由原型復(fù)制生成的。
JS中有兩個特殊的對象:Object與Function倘屹,它們都是構(gòu)造函數(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)A蚵椤),默認的只有一個叫做constructor的屬性樊卓,指向這個函數(shù)本身拿愧。
如上圖,SuperType是是一個函數(shù)碌尔,右側(cè)的方框就是它的原型浇辜。
JavaScript 原型鏈和作用域的講解,已經(jīng)明白
http://www.cnblogs.com/wangfupeng1988/p/3977924.html
在一段js代碼拿過來真正一句一句運行之前唾戚,瀏覽器已經(jīng)做了一些“準(zhǔn)備工作”柳洋,其中就包括對變量的聲明,而不是賦值叹坦。變量賦值是在賦值語句執(zhí)行的時候進行的膳灶。可用下圖模擬:
“準(zhǔn)備工作”介紹完畢立由。
我們總結(jié)一下轧钓,在“準(zhǔn)備工作”中完成了哪些工作:
變量、函數(shù)表達式——變量聲明锐膜,默認賦值為undefined毕箍;
this——賦值;
函數(shù)聲明——賦值道盏;
這三種數(shù)據(jù)的準(zhǔn)備情況我們稱之為“執(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)境芒涡。當(dāng)函數(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)作用域”店枣。