理解javascript原型和範圍系列(12)——簡介【範圍】,javascript原型
前幾節的文章請查閱《理解javascript原型和範圍系列》
提到範圍,有一句話大家(有js開發經驗者)可能比較熟悉:“javascript沒有塊級範圍”。所謂“塊”,就是大括弧“{}”中間的語句。例如if語句:
再比如for語句:
所以,我們在編寫代碼的時候,不要在“塊”裡面聲明變數,要在代碼的一開始就聲明好了。以避免發生歧義。如:
其實,你光知道“javascript沒有塊級範圍”是完全不夠的,你需要知道的是——javascript除了全域範圍之外,只有函數可以建立的範圍。
所以,我們在聲明變數時,全域代碼要在代碼前端聲明,函數中要在函數體一開始就聲明好。除了這兩個地方,其他地方都不要出現變數聲明。而且建議用“單var”形式。
jQuery就是一個很好的樣本:
下面繼續說範圍。範圍是一個很抽象的概念,類似於一個“地盤”
如,全域代碼和fn、bar兩個函數都會形成一個範圍。而且,範圍有上下級的關係,上下級關係的確定就看函數是在哪個範圍下建立的。例如,fn範圍下建立了bar函數,那麼“fn範圍”就是“bar範圍”的上級。
範圍最大的用處就是隔離變數,不同範圍下同名變數不會有衝突。例如以上代碼中,三個範圍下都聲明了“a”這個變數,但是他們不會有衝突。各自的範圍下,用各自的“a”。
說到這裡,咱們又可以拿出jquery源碼來講講了。
jQuery源碼的最外層是一個自動執行的匿名函數:
為什麼要這樣做呢?
原因就是在jQuery源碼中,聲明了大量的變數,這些變數將通過一個函數被限制在一個獨立的範圍中,而不會與全域範圍或者其他函數範圍的同名變數產生衝突。
全世界的開發人員都在用jQuery,如果不這樣做,很可能導致jQuery源碼中的變數與外部javascript代碼中的變數重名,從而產生衝突。
範圍這塊只是很不好解釋,咱們就小步快跑,一步一步慢慢展示給大家。
下一節將把範圍和執行內容環境結合起來說一說。
可見,要理解閉包,不是一兩句話能說清楚的。。。
---------------------------------------------------------------------------
本文已更新到《理解javascript原型和範圍系列》的目錄,更多內容可參見《理解javascript原型和範圍系列》。
另外,歡迎關注我的微博。
也歡迎關注我的其他教程——別怕,都是免費的!
《微軟petshop4.0源碼解讀視頻》《json2.js源碼解讀視頻》
--------------------------------------------------------------------------
javascript範圍鏈與原型鏈有聯絡?從原理上分析,不要說我網上找得到的
個人感覺,沒什麼聯絡。
一般來說,範圍鏈是針對變數的,js裡面大的範圍上來說,只有兩種範圍,全域範圍和函數內部範圍,如果函數1裡面又定義了函數2(一般都是匿名函數), 那麼就有了這麼一個範圍鏈全域範圍==>函數1範圍==>函數2範圍;特點是函數1裡面可以直接使用全域範圍的變數,函數2裡面可以直接使用全域範圍和函數1範圍的變數
原型鏈的話,一般是定義建構函式時用到,可以認為是針對建構函式的或者說針對建構函式對應的類的;原型鏈的頭部就是Object類/建構函式,如果有建構函式1.prototype = 建構函式2;那麼也就有這麼一個原型鏈; Object ==> 建構函式1 ==> 建構函式2,這樣的好處是建構函式2對應的類,可以擁有建構函式1 和Object中的屬性,js沒有對應繼承的關鍵字,所以用原型鏈來類比繼承的效果。
純手打,希望對你有協助
javascript 範圍問題
this.b=100;
this.c={
d:function(){
alert(this.b);//這裡會彈出undefined,怎麼才能顯示function a()中的100?
}
}
}
var i=new a();
i.c.d.call(i);