Javascript 鏈式作用域
十年的薩迦網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都營銷網站建設的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整薩迦建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯從事“薩迦網站設計”,“薩迦網站推廣”以來,每個客戶項目都認真落實執行。
其實對于Javascript鏈式作用域的描述,包括,JS權威指南,都有些太冗長了--但是很準確:JavaScript中的函數運行在他們被定義的作用域里,而不是他們被執行的作用域里。
這句話有點難懂,但程序的設計,基本都是為了簡單,便于理解的。記住JS中經典的一句話是,一切皆對象。
說白了鏈式作用域,其實就是Javascript的一個特性:子函數中可以訪問父函數的所有變量。當然也包括全局變量window(一般的函數定義function a(){},其實都是window對象的子函數)。另外補充一下,函數定義有兩種方式,其實略有差別:
var a=function(){}和function a(){},
稍后再解釋他們的區別。
所以,我們看Crockford的<<Javascript語言精粹>>中就提到,要在一個函數中定義變量,要養成良好的習慣,請直接在函數開頭定義變量。JS中這點上有別于其它語言的要求----盡量推遲變量定義(使用前定義)。
我們看一下laruence提供的例子:
var name = 'laruence'; functionecho(){ alert(name); var name = 'eve'; alert(name); alert(age); } echo();
這個例子其實很有迷惑性(會讓人錯誤的以為,輸出結果是:laruence,eve,error;其實結果是:undefined,eve,error),關鍵就是因為echo()函數中定義的var name='eve'。但其實換個寫法,這個例子就很清楚了:
var name = 'laruence'; function echo() { var name; alert(name); name = 'eve'; alert(name); alert(age); } echo();
其實,上面的函數在JS引擎解析的時候,就會被解析成這樣。如果你是初學者,其實這樣理解就可以了。但如果你有別的程序的編程經驗,例如java。就很容易被慣用思維給套住了,PS:本人就是給套住的一個。所以,還是按照Crockford的建議把,定義變量,請在函數頂部!!
還記得之前的問題嗎?
var a=function(){}和function a(){}的區別。
它們的區別還變量的定義比較類似。一切皆對象。
他們兩個在函數調用時,基本是等價的,但如果調用函數,在定義函數前就會有問題了。其實區別在于等號和function關鍵字。
var和function定義在預編譯的時候被提前,var只是占位,具體賦值要等到JS引擎執行到這行。而function定義會在JS引擎預編譯階段就被直接放入到調用對象中。
還是要舉例:
例子一:
alert( echo );//function echo(){return 1;}; function echo(){return 1;}; alert( a );//undefined var a=function(){return 1;};
所以,函數的定義也可以引申出一句話,請將函數定義放在頂部(先定義后調用)!!
其實還是習慣的問題,JS中一些代碼的優良習慣有別于其它語言。建議大家讀一下<<Javascript語言精粹>>。在開始學習一門語言時,最好從欣賞優秀的代碼開始。而JS中,大家都喜歡用一系列充滿迷惑性的代碼來加深自己的理解,這其實是一個誤區。
另外說一點,this關鍵字,laruence的解釋很簡潔到位:"誰調用,誰就是this"。英文版更詳細一點:“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永遠引用我們所執行函數的擁有者,更準確的說,this引用一個函數的方法對象”。
看看下面的例子,也是誤導人的:
function a(){ g_value="uk"; } a(); alert(g_value);
其實,比較友好的寫法應該是這樣:
function a(){ this.g_value="uk"; } a();//a.apply(this); alert(this.g_value);
關于this關鍵字,和別的語言也有區別。首先它并不是實例的引用,而是調用它的上下文。上面例子的a(),等價于a.apply(this);
call和apply的用法是一樣的,區別就在參數傳遞上。一個是一個一個傳參數的,一個是將參數作為類數組傳遞的(注意這個地方是類數組)。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
網頁題目:Javascript鏈式作用域詳細介紹
分享路徑:http://m.newbst.com/article42/gdeiec.html
成都網站建設公司_創新互聯,為您提供企業建站、網站排名、手機網站建設、App開發、虛擬主機、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯