如果你不知道什麼是作用域,建議你先看什麼是作用域鏈,什麼是原型鏈。這篇文章,因為這些內容都是有關聯性的。
什麼是自由變數?
如我在全域性中定義了乙個變數a,然後我在函式中使用了這個a,這個a就可以稱之為自由變數,可以這樣理解,凡是跨了自己的作用域的變數都叫自由變數。
var a = "追夢子";function
b()b();
上面的這段**中的變數a就是乙個自由變數,因為在函式b執行到console.log(a)的時候,發現在函式中找不到變數a,於是就往上一層中找,最後找到了全域性變數a。
作用域的高階
var aa = 22;function
a()function
b(fn)
b(a);
//22
最後列印的不是11而是22,為什麼會這樣呢?在我解釋之前我建議你事先看一下js中的執行上下文,菜鳥入門基礎。這一文,如果不了解js的執行順序就比較難以理解,另外如果你看了我這幾天的文章應該有種感覺,就是內容的關聯性都特別強,這也是為什麼很多js新手朋友不能夠理解的地方。
我們接著說為什麼列印的是22,一起來分析一下這段**。
假如我們的**是這樣的
var aa = 22;function
a()
列印出的是22,我想大家應該沒有意見,但是有一點我一定要提,那就是在建立這個函式的時候,這個函式的作用域就已經決定了,而是不是在呼叫的時候,這句話至管重要。
有了這句話的基礎是不是理解上面的那段**就變得不值一提了?
為了照護新手朋友我還是分析一下過程吧。
首先我們建立了乙個全域性變數aa
var aa = 22;
接著我們建立了乙個函式a
functiona()
這時js解析這個函式的時候,就已經決定了這個函式a的作用域,既如果在函式a中找不到變數aa那就會到全域性變數中找,如果找到了就返回這個aa,如果找不到就報錯。
接著我們又建立了乙個函式b
functionb(fn)
在函式b中我們定義了又重新定義了這個變數aa,雖然我們這個時候重新定義了變數aa,但是因為函式a的作用域在建立的時候已經決定了,所以在函式b中建立的那個變數aa以及和函式a裡面的那個變數aa沒有關係了。
functionb(fn)
b(a);
我們把函式a傳到了函式b中,並且當做函式b的形參,接著我們執行了這個被傳進去的函式a,最後列印出來的就是22。
在建立這個函式的時候,這個函式的作用域就已經決定了,而是不是在呼叫的時候。
理解js中的自由變數以及作用域的高階
如果你不知道什麼是作用域,建議你先看什麼是作用域鏈,什麼是原型鏈。這篇文章,因為這些內容都是有關聯性的。什麼是自由變數?如我在全域性中定義了乙個變數a,然後我在函式中使用了這個a,這個a就可以稱之為自由變數,可以這樣理解,凡是跨了自己的作用域的變數都叫自由變數。var a 追夢子 function ...
JavaScript 自由變數以及作用域鏈
切入正題之前,我們先看一段 var x 10 function fn function show f show fn 注 function 表示乙個匿名函式。function arg 定義了乙個引數為arg的匿名函式,然後使用 function arg param 來呼叫這個匿名函式。其中param...
深入理解JS中的變數作用域
變數的作用域有兩種 全域性變數和區域性變數。全域性變數最外層函式定義的變數擁有全域性作用域,即對任何內部函式來說,都是可以訪問的 var n 10 function f1 f1 輸出10,說明全域性變數n在函式內部被讀取區域性變數區域性變數 在函式內部宣告的變數。函式內部的變數,外部無法讀取。fun...