亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

網(wǎng)易JS面試題與Javascript詞法作用域說明

 更新時間:2010年11月09日 10:01:16   作者:  
Javascript函數(shù)在定義它們的作用域里運行,而不是在執(zhí)行它們的作用域里運行。
調(diào)用對象位于作用域鏈的前端,局部變量(在函數(shù)內(nèi)部用var聲明的變量)、函數(shù)參數(shù)及Arguments對象都在函數(shù)內(nèi)的作用域中——這意味著它們隱藏了作用域鏈更上層的任何同名的屬性。

2010年9月14日,我去參加網(wǎng)易網(wǎng)頁工程師招聘會,應(yīng)聘JS工程師職位。有幸參加筆試,然后有幸栽在筆試,呵呵。廢話少說,抓出音響極深的一題重新研究研究。

題目大概是:寫出如下代碼的輸出結(jié)果并進(jìn)行分析

復(fù)制代碼 代碼如下:

var tt = 'aa';
function test(){
alert(tt);
var tt = 'dd';
alert(tt);
}
test();

“太簡單了!”這是我當(dāng)時看到這個題目是的第一想法,于是輕率答題竟成我的致命之傷。我的答案是——aa和dd,解析:第一次輸出全局變量的結(jié)果,然后局部變量tt覆蓋全局變量所引用的值,所以第二次輸出結(jié)果是dd。

任何人見我如此作答,都會認(rèn)為我是在掃盲——想法及其幼稚(我也這么認(rèn)為)!

網(wǎng)易啊,怎么可能會滿意于這種答案!

正確的答案應(yīng)該是:undefined和dd

為什么第一次alert的結(jié)果是undefined呢?要解釋得清楚明白需要用到Javascript的詞法作用域。

Javascript中的函數(shù)“在定義它們的作用域里運行,而不是在執(zhí)行它們的作用域里運行”,這是權(quán)威指南里抽象而精辟的總結(jié)。

Javascript的邏輯默認(rèn)在一個全局作用域中執(zhí)行,如以上程序段中的“var tt='aa';”就是定義一個全局作用域的全局變量(如果以上代碼段不是摘自某個函數(shù)鏈的話)。而test()函數(shù)內(nèi)部的邏輯必須在原有的作用域(全局 作用域)鏈再添加test函數(shù)本身的作用域(局部性)——這些思想幾乎在每一種語言中都是如此定義的,然而Javascript作用域鏈的特別之處在于函 數(shù)內(nèi)部能夠嵌套函數(shù)的定義(這是閉包的基礎(chǔ)。注:在JS中函數(shù)是唯一形式的代碼作用域)

嵌套的內(nèi)部函數(shù)可以調(diào)用外部函數(shù)(被嵌套的函數(shù))的變量和其他嵌套函數(shù)(函數(shù)是一種數(shù)據(jù))。如果是在外部函數(shù)內(nèi)調(diào)用嵌套函數(shù),那么調(diào)用對象不變,當(dāng) 外部函數(shù)執(zhí)行完畢后所有數(shù)據(jù)(包括外部函數(shù)和嵌套的內(nèi)部函數(shù))都將被垃圾回收機(jī)制收集——這一點還不能體現(xiàn)出‘閉包'的精華。有一種情況,就是 Javascript允許外部調(diào)用嵌套的內(nèi)部函數(shù),即使被嵌套函數(shù)已經(jīng)被‘垃圾收集'——最常見的就是在‘某個函數(shù)'中用其嵌套的內(nèi)部函數(shù)定義某些元素的 響應(yīng)事件,頁面載入的時候被嵌套函數(shù)(‘某個函數(shù)')已經(jīng)執(zhí)行完畢(被垃圾回收),但當(dāng)事件觸發(fā)的時候仍然會有響應(yīng)的動作,而且響應(yīng)函數(shù)中還可能調(diào)用到在 被嵌套函數(shù)(‘某個函數(shù)')中定義的變量最終值(不是被垃圾回收了嗎?)。

關(guān)于閉包的知識和示例有很多資料可供查詢,我不想敘述。

本文的重點是以下非常重要的細(xì)節(jié):

調(diào)用對象位于作用域鏈的前端,局部變量(在函數(shù)內(nèi)部用var聲明的變量)、函數(shù)參數(shù)及Arguments對象都在函數(shù)內(nèi)的作用域中——這意味著它們隱藏了作用域鏈更上層的任何同名的屬性。

即,在以上程序片段中,test函數(shù)內(nèi)部的“var tt='dd'”將會致使“var tt='aa'”在test函數(shù)被調(diào)用時完全被隱藏。而且,tt是在第一個alert語句之后定義,所以在調(diào)用到第一個alert時,tt是還沒有被賦值 的。這樣說可能會清楚一點,即,在定義test函數(shù)時,當(dāng)定義第一個alert(tt)時,這里會記錄tt是作用域鏈中的一個變量但不會記錄它(tt)的 值,函數(shù)定義完畢后tt就添加到作用域里,所以第一個alert語句能夠找到該作用域里的tt(即,相當(dāng)于找到一個已經(jīng)在函數(shù)內(nèi)部聲明,但未被賦值的 tt)。

以上程序片段的執(zhí)行結(jié)果與以下片段的結(jié)果相同:

復(fù)制代碼 代碼如下:

var tt = 'aa';
function test(){
var tt;
alert(tt);
tt = 'dd';
alert(tt);
}
test();

Javascript的作用域不可簡單的用C++等語言的思維來理解啊!C++在調(diào)用函數(shù)之前必須先聲明或定義,而Javascript沒必要。在 Javascript中可以先調(diào)用函數(shù),后再定義(不用在調(diào)用之前作任何聲明)。因為在調(diào)用函數(shù)時,Javascript是向作用域鏈要函數(shù)的定義(函數(shù)在定義它們的作用域里運行,而不是在執(zhí)行它們的作用域里運行)

如以上代碼寫成:
復(fù)制代碼 代碼如下:

var tt = 'aa';
test(); //先調(diào)用后再定義
function test(){
alert(tt); //undefined
var tt = 'dd';
alert(tt); //dd
}

以上代碼片段雖然能夠得到相同的結(jié)果,但最好不要那樣寫啦,習(xí)慣不好,代碼不好維護(hù)。

相關(guān)文章

  • BootStrap輪播HTML代碼(推薦)

    BootStrap輪播HTML代碼(推薦)

    本文給大家分享bootstrap輪播h tml代碼,代碼簡單易懂非常不錯,具有參考借鑒,需要的朋友參考下吧
    2016-12-12
  • js中取得變量絕對值的方法

    js中取得變量絕對值的方法

    這篇文章主要介紹了js中取得變量絕對值的方法,較為詳細(xì)的分析了js中abs方法取絕對值的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • JS基于myFocus庫實現(xiàn)各種功能的tab選項卡切換效果

    JS基于myFocus庫實現(xiàn)各種功能的tab選項卡切換效果

    這篇文章主要介紹了JS基于myFocus庫實現(xiàn)各種功能的tab選項卡切換效果,實例演示了JS實現(xiàn)tab嵌套顯示及常用過度效果的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • layui form表單提交之后重新加載數(shù)據(jù)表格的方法

    layui form表單提交之后重新加載數(shù)據(jù)表格的方法

    今天小編就為大家分享一篇layui form表單提交之后重新加載數(shù)據(jù)表格的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JS獲取當(dāng)前時間戳方法解析

    JS獲取當(dāng)前時間戳方法解析

    這篇文章主要介紹了JS獲取當(dāng)前時間戳方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • JWT?Json?Web?Token全面詳解

    JWT?Json?Web?Token全面詳解

    這篇文章主要為大家介紹了JWT?Json?Web?Token全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-11-11
  • 使用控制臺破解百小度一個月只準(zhǔn)改一次名字

    使用控制臺破解百小度一個月只準(zhǔn)改一次名字

    這篇文章主要介紹了使用控制臺破解百小度一個月只準(zhǔn)改一次名字的方法和代碼,有需要的小伙伴可以參考下。
    2015-08-08
  • 為JS擴(kuò)展Array.prototype.indexOf引發(fā)的問題探討及解決

    為JS擴(kuò)展Array.prototype.indexOf引發(fā)的問題探討及解決

    Array沒有indexOf方法,這樣在一個數(shù)組中查找某個元素的索引時比較麻煩,于是通過prototype原型擴(kuò)展了Array.prototype.indexOf(),在對數(shù)組進(jìn)行遍歷的時候卻出現(xiàn)了問題
    2013-04-04
  • js截取函數(shù)(indexOf,join等)

    js截取函數(shù)(indexOf,join等)

    下面是js中截取字符串經(jīng)常會用到的一些函數(shù),這里每個函數(shù)都給出了例子,學(xué)習(xí)的朋友可以參考下。
    2010-09-09
  • js實時獲取并顯示當(dāng)前時間的方法

    js實時獲取并顯示當(dāng)前時間的方法

    這篇文章主要介紹了js實時獲取并顯示當(dāng)前時間的方法,涉及javascript針對時間及頁面元素的相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論