天天看點

js作用域問題一步步透徹了解

黃金守則第一條:

    js沒有塊級作用域(你可以自己閉包或其他方法實作),隻有函數級作用域,函數外面的變量函數裡面可以找到,函數裡面的變量外面找不到。

   first try:

js作用域問題一步步透徹了解

  這是為什麼呢??

其實原理大家都懂,應該就是易錯而已,萬變不離其綜。

 second try:

js作用域問題一步步透徹了解

這是為什麼呢? 因為給a指派b的時候,b還沒有定義,是以a是undefined,b是10.

黃金守則第二條:

   變量的查找是就近原則,去尋找var定義的變量,當就近沒有找到的時候就去查找外層。

look:

js作用域問題一步步透徹了解

這是為什麼呢、? 這裡面有兩個原因,一是預解析,二是就近查找。

attention:

js作用域問題一步步透徹了解

這個吧,就驗證了第二條,雖然是就近原則,但是是就近找var聲明的變量,這個是因為沒有var聲明的變量是全局的,這裡隻是修改了a的值。是以上面就是因為在函數内沒找到var的a,于是到外面去找了,一找就找到了,于是a就alert出10了;不過沒錯的是a=20後,a确實為20了,隻不過alert的時候還沒有執行到那~~

看吧~

js作用域問題一步步透徹了解

下面這個例子,更加驗證了js的函數作用域 而已:

js作用域問題一步步透徹了解

這是因為在alert(a)的時候,bbb函數中的a确實為20 ,可是它對于這時的alert(a)這句話來說是局部的,alert(a)根本找不到bbb函數中的a,是以在aaa函數中它找不到a,于是乎去外面找,一找,就找到了10。

黃金守則第三條:

    當參數跟局部變量重名時,優先級是等同的。

例:

js作用域問題一步步透徹了解

 還有:傳參時,基本類型傳值,引用類型傳引用。(但是重新指派之後就不是這樣了喔)

上面代碼沒有問題,但是下面就不一樣啦。

js作用域問題一步步透徹了解

因為b被重新指派了,不指向a了。

此外,參數與變量的作用域是相似的:

js作用域問題一步步透徹了解

對比上下這兩個:

js作用域問題一步步透徹了解

上面是參數是基本類型,隻傳了值進去,下面的傳個引用類型:(同樣也包含重新指派的情況)

js作用域問題一步步透徹了解
js作用域問題一步步透徹了解

繼續閱讀