Javascript 鏈?zhǔn)阶饔糜蛟敿?xì)介紹
Javascript 鏈?zhǔn)阶饔糜?/strong>
其實(shí)對(duì)于Javascript鏈?zhǔn)阶饔糜虻拿枋觯ǎ琂S權(quán)威指南,都有些太冗長了--但是很準(zhǔn)確:JavaScript中的函數(shù)運(yùn)行在他們被定義的作用域里,而不是他們被執(zhí)行的作用域里。
這句話有點(diǎn)難懂,但程序的設(shè)計(jì),基本都是為了簡單,便于理解的。記住JS中經(jīng)典的一句話是,一切皆對(duì)象。
說白了鏈?zhǔn)阶饔糜?,其?shí)就是Javascript的一個(gè)特性:子函數(shù)中可以訪問父函數(shù)的所有變量。當(dāng)然也包括全局變量window(一般的函數(shù)定義function a(){},其實(shí)都是window對(duì)象的子函數(shù))。另外補(bǔ)充一下,函數(shù)定義有兩種方式,其實(shí)略有差別:
var a=function(){}和function a(){},
稍后再解釋他們的區(qū)別。
所以,我們看Crockford的<<Javascript語言精粹>>中就提到,要在一個(gè)函數(shù)中定義變量,要養(yǎng)成良好的習(xí)慣,請(qǐng)直接在函數(shù)開頭定義變量。JS中這點(diǎn)上有別于其它語言的要求----盡量推遲變量定義(使用前定義)。
我們看一下laruence提供的例子:
var name = 'laruence'; functionecho(){ alert(name); var name = 'eve'; alert(name); alert(age); } echo();
這個(gè)例子其實(shí)很有迷惑性(會(huì)讓人錯(cuò)誤的以為,輸出結(jié)果是:laruence,eve,error;其實(shí)結(jié)果是:undefined,eve,error),關(guān)鍵就是因?yàn)閑cho()函數(shù)中定義的var name='eve'。但其實(shí)換個(gè)寫法,這個(gè)例子就很清楚了:
var name = 'laruence'; function echo() { var name; alert(name); name = 'eve'; alert(name); alert(age); } echo();
其實(shí),上面的函數(shù)在JS引擎解析的時(shí)候,就會(huì)被解析成這樣。如果你是初學(xué)者,其實(shí)這樣理解就可以了。但如果你有別的程序的編程經(jīng)驗(yàn),例如java。就很容易被慣用思維給套住了,PS:本人就是給套住的一個(gè)。所以,還是按照Crockford的建議把,定義變量,請(qǐng)?jiān)诤瘮?shù)頂部??!
還記得之前的問題嗎?
var a=function(){}和function a(){}的區(qū)別。
它們的區(qū)別還變量的定義比較類似。一切皆對(duì)象。
他們兩個(gè)在函數(shù)調(diào)用時(shí),基本是等價(jià)的,但如果調(diào)用函數(shù),在定義函數(shù)前就會(huì)有問題了。其實(shí)區(qū)別在于等號(hào)和function關(guān)鍵字。
var和function定義在預(yù)編譯的時(shí)候被提前,var只是占位,具體賦值要等到JS引擎執(zhí)行到這行。而function定義會(huì)在JS引擎預(yù)編譯階段就被直接放入到調(diào)用對(duì)象中。
還是要舉例:
例子一:
alert( echo );//function echo(){return 1;}; function echo(){return 1;}; alert( a );//undefined var a=function(){return 1;};
所以,函數(shù)的定義也可以引申出一句話,請(qǐng)將函數(shù)定義放在頂部(先定義后調(diào)用)!!
其實(shí)還是習(xí)慣的問題,JS中一些代碼的優(yōu)良習(xí)慣有別于其它語言。建議大家讀一下<<Javascript語言精粹>>。在開始學(xué)習(xí)一門語言時(shí),最好從欣賞優(yōu)秀的代碼開始。而JS中,大家都喜歡用一系列充滿迷惑性的代碼來加深自己的理解,這其實(shí)是一個(gè)誤區(qū)。
另外說一點(diǎn),this關(guān)鍵字,laruence的解釋很簡潔到位:"誰調(diào)用,誰就是this"。英文版更詳細(xì)一點(diǎn):“In JavaScript this always refers to the “owner” of the function we're executing, or rather, to the object that a function is a method of. ”,中文解釋:“在JavaScript中,this永遠(yuǎn)引用我們所執(zhí)行函數(shù)的擁有者,更準(zhǔn)確的說,this引用一個(gè)函數(shù)的方法對(duì)象”。
看看下面的例子,也是誤導(dǎo)人的:
function a(){ g_value="uk"; } a(); alert(g_value);
其實(shí),比較友好的寫法應(yīng)該是這樣:
function a(){ this.g_value="uk"; } a();//a.apply(this); alert(this.g_value);
關(guān)于this關(guān)鍵字,和別的語言也有區(qū)別。首先它并不是實(shí)例的引用,而是調(diào)用它的上下文。上面例子的a(),等價(jià)于a.apply(this);
call和apply的用法是一樣的,區(qū)別就在參數(shù)傳遞上。一個(gè)是一個(gè)一個(gè)傳參數(shù)的,一個(gè)是將參數(shù)作為類數(shù)組傳遞的(注意這個(gè)地方是類數(shù)組)。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Three.js實(shí)現(xiàn)瀏覽器變動(dòng)時(shí)進(jìn)行自適應(yīng)的方法
這篇文章主要給大家介紹了關(guān)于Three.js實(shí)現(xiàn)瀏覽器變動(dòng)時(shí)進(jìn)行自適應(yīng)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09基于Web標(biāo)準(zhǔn)的UI組件 — 樹狀菜單(2)
基于Web標(biāo)準(zhǔn)的UI組件 — 樹狀菜單(2)...2006-09-09JavaScript操作localStorage實(shí)現(xiàn)保存本地json文件
這篇文章主要為大家詳細(xì)介紹了JavaScript如何操作localStorage實(shí)現(xiàn)保存本地json文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02JS 用6N±1法求素?cái)?shù) 實(shí)例教程
顯然,當(dāng)N≥1時(shí),6N,6N+2,6N+3,6N+4都不是素?cái)?shù),只有形如6N+1和6N+5的自然數(shù)有可能是素?cái)?shù)。所以,除了2和3之外,所有的素?cái)?shù)都可以表示成6N±1的形式(N為自然數(shù))。2009-10-10BootStrap Table后臺(tái)分頁時(shí)前臺(tái)刪除最后一頁所有數(shù)據(jù)refresh刷新后無數(shù)據(jù)問題
這篇文章主要介紹了BootStrap Table后臺(tái)分頁時(shí)前臺(tái)刪除最后一頁所有數(shù)據(jù)refresh刷新后無數(shù)據(jù)問題,需要的朋友可以參考下2016-12-12JavaScript簡單實(shí)現(xiàn)的仿微博留言功能示例
這篇文章主要介紹了JavaScript簡單實(shí)現(xiàn)的仿微博留言功能,涉及javascript頁面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-01-01