最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript變量的作用域和作用域鏈詳解

 更新時間:2015年04月02日 10:13:42   投稿:junjie  
這篇文章主要介紹了Javascript變量的作用域和作用域鏈詳解,本文用一個實例和運行結果來講解這兩個知識,需要的朋友可以參考下

工作這幾年,js學的不是很好,正好周末有些閑時間,索性買本《js權威指南》,大名鼎鼎的犀牛書,好好的把js深入的看一看。買過這本書的第一印象就是賊厚,不過后面有一半部分都是參考手冊。

一:作用域

  說起變量第一個要說到的肯定就是作用域,正是因為不熟悉JS的作用域,往往就會把面向對象的作用域張冠李戴,畢竟有些東西總是習慣性的這樣,但是并不是每次照搬都是可以的,那么下一個問題就來了,js到底是什么作用域,當然是函數作用域了,我們的瀏覽器就是一個被實例化的window對象,如果在window下定義一個name字段,那么name字段就具有window這個函數作用域,也就是在window下都是可以訪問的,如果在window下定義一個function ctrip,然后里面再定義一個name,那么這個新定義的name只能在ctrip函數下通用,而老的name繼續(xù)在window下通用,舉個例子。

從圖中可以看出兩點:

1: 在window下定義了一個name,居然還可以在function下定義一個重名的name,這個在C#里面是不可想象的。

2:在JS下就可以做到眼瞎,它只認自己的作用域,所以就出現了第一個"second",你可能覺得這個沒有什么稀奇的地方,這是因為可能你還沒有真正理解什么是函數作用域,解析器在執(zhí)行ctrip的時候,第一件事情就是尋找ctrip下的所有局部變量,然后再執(zhí)行后續(xù)語句,既然是先尋找,那么var name="second"這條語句定義在ctrip中任何位置都是可以的,下面我們把語句調換過來。

可以看到在ctrip函數下,第一個console.log輸出的是undefined,這個結果可以證實,確實做了第一件事情是收集到了name這個局部變量,可能有人說為什么沒有變成”second“,那是因為初始化操作必須是逐語句執(zhí)行,所以在ctrip函數中執(zhí)行console.log(name)時,此時解析器只知道有一個未賦值的變量name,所以就console的時候就是undefined了。

二:作用域鏈

  從上面的這個例子中我們也很清楚的知道了,在function中定義的變量只具有function范圍內的作用域,同時我們也看到上面這個例子只是一層嵌套,window是個大的function,里面是一個ctrip的function,同樣的道理也可以延伸到多層嵌套,比如三層,四層。。。。N層,這些層就形成了一個鏈式結構。

從圖中可以看到,我在ctrip下再定義了一個plane函數,這樣的話就有三層了,輸出的結果也是我們希望看到的,每層的name只在自己的作用域范圍

內生效,但是下面有一個問題來了,有一天我傻逼了,在定義plane的函數時,把 var name="third" 中的var忘記寫了,那么這個時候,plane中的

name到底是什么值呢? 是first還是second呢?

復制代碼 代碼如下:

var name="first";
function ctrip(){
  var name="second";
  function plane(){
     name="third";
     console.log(name);
  }
  plane();
  console.log(name);
}
ctrip();
console.log(name);

現在就是考驗你是否真的懂了作用域鏈,仔細想想會發(fā)現,當代碼執(zhí)行到plane函數中的name=”third“時,發(fā)現plane函數中并沒有name這個局部變量,恰好代碼又在ctrip這個大函數中,所以解析器就會回溯到ctrip函數中尋找name,發(fā)現果然有name,這個時候就把ctrip的name修改成了”third“。

又有一天,我喝多了酒又傻逼了一回,在定義plane函數的時候,把name="third" 錯寫成了 nam="third"; 丟了一個e,你可以說是酒精的問題,

又不是我代碼的問題。那么這個時候解析器該怎么處理呢?同樣的道理,在回溯時,發(fā)現ctrip沒有,再回溯到頂層的window下,發(fā)現還是沒有,

這個時候解析器做了這樣的處理,既然整個鏈中都沒有,你又賦值了,我總不能給你報錯,那多尷尬呀,就索性給你在window下隱式的定義一個

nam變量,這個時候nam其實就是全局變量了。我們可以在window頂層console一下nam看看。

好了,關于變量的東西也就這么多了,沒什么稀奇的,理解了就沒什么意思了。

相關文章

  • IE6/7中getAttribute獲取href/src 屬性(相對路徑0值與其它瀏覽器不同

    IE6/7中getAttribute獲取href/src 屬性(相對路徑0值與其它瀏覽器不同

    IE6/7中getAttribute獲取href/src 屬性(相對路徑0值與其它瀏覽器不同的解決方法
    2011-08-08
  • JS中的const命令你真懂它嗎

    JS中的const命令你真懂它嗎

    這篇文章主要介紹了JS中的const命令你真懂它嗎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • TypeScript入門-基本數據類型

    TypeScript入門-基本數據類型

    本文主要介紹了TypeScript基本數據類型的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • JavaScript導出Excel實例詳解

    JavaScript導出Excel實例詳解

    這篇文章主要介紹了JavaScript導出Excel的方法,以實例形式詳細分析了javascript將WEB頁面導出為EXCEL文檔的方法及相關的技巧說明,對于深入了解javascript編程原理有一定的借鑒價值,需要的朋友可以參考下
    2014-11-11
  • javascript跑馬燈抽獎實例講解

    javascript跑馬燈抽獎實例講解

    這篇文章主要為大家介紹了javascript跑馬燈抽獎特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • JS前端開發(fā)之exec()和match()的對比使用

    JS前端開發(fā)之exec()和match()的對比使用

    match()方法可在字符串內檢索指定的值,或找到一個或多個正則表達式的匹配,下面這篇文章主要給大家介紹了關于JS前端開發(fā)之exec()和match()的對比使用的相關資料,需要的朋友可以參考下
    2022-09-09
  • 淺談前端JS沙箱實現的幾種方式

    淺談前端JS沙箱實現的幾種方式

    在微前端領域當中,沙箱是很重要的一件事情。本文就淺談前端JS沙箱實現的幾種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 使用javascript實現雪花飄落的效果

    使用javascript實現雪花飄落的效果

    本文主要介紹了使用javascript實現雪花飄落的特效,雖然網上有很多,不過都是比較陳舊了,兼容性不是太好,于是動手寫一個,把思路和實現代碼都分享給大家。
    2015-01-01
  • 原生Js實現元素漸隱/漸現(原理為修改元素的css透明度)

    原生Js實現元素漸隱/漸現(原理為修改元素的css透明度)

    大家經常看到網頁里圖片漸變顯示,自己寫一個。原理很簡單就是修改元素的css透明度,具體實現代碼如下,感興趣的各位可以參考下哈,希望對大家有所幫助
    2013-06-06
  • js實現仿MSN帶關閉功能的右下角彈窗代碼

    js實現仿MSN帶關閉功能的右下角彈窗代碼

    這篇文章主要介紹了js實現仿MSN帶關閉功能的右下角彈窗代碼,涉及javascript操作頁面元素的布局及屬性的動態(tài)變換技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09

最新評論

平果县| 太仓市| 康马县| 永和县| 牡丹江市| 元阳县| 勃利县| 普陀区| 新闻| 海淀区| 泰州市| 长春市| 江口县| 启东市| 大石桥市| 普陀区| 南平市| 古田县| 景宁| 汤阴县| 唐海县| 瓦房店市| 万宁市| 西林县| 呼玛县| 大兴区| 六枝特区| 丹阳市| 吉林省| 阆中市| 东乌珠穆沁旗| 永定县| 江北区| 博客| 秀山| 安远县| 布拖县| 会东县| 马龙县| 措美县| 九龙坡区|