3,範圍
所有的物件導向的語言都有某種形式的範圍,JavaScript也不例外。在JavaScript裡,範圍是由函數劃分的,而不是由塊(while,if之類的)來劃分的。
我們先來看一個簡單的範圍的例子。
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
在if塊中,雖然foo的值改為“b“,但還是在全域範圍中,所以輸出結果是“b“。
基於瀏覽器的JavaScript語言有一門有趣的特性是,所有屬於全域範圍的變數都是window對象的屬性。
看下面代碼:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
我們再上例的基礎上,再添加一個函數來修改foo的值,代碼如下:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
結果也許有點另你意外,不過結果肯定是正確的。代碼②的結果是輸出 "b",而不是"c"。原因就是範圍有關,雖然調用change()來改變foo的值,但是此時的改變只
在函數範圍內起作用,並不會改變全域範圍內的foo的值。
如果想在change()函數內修改全域的foo的值,我們可以去掉變數的聲明,例如:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
在JavaScript中,如果變數沒有顯式定義,它就是全域定義的。所以調用change()後,會修改全域foo的值。最終輸出"c" 。
4,內容物件
在JavaScript中,代碼總是有一個內容物件,代碼處於該對象之內。內容物件是通過this變數來體現的。這個變數永遠指向當前代碼所處的對象中。
全域對象其實是window對象的屬性。
接下來,我們看一個內容物件的例子。
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
再此基礎上,我們再看一個例子:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
本例中,我們把obj.hide變數的內容物件變為window對象時,代碼寫得並不好理解。幸運的是,JavaScript提供了一套更好的方法來解決。
現在我們有請call和apply兩位先生上場,通過它們也可以完成同樣的功能。先看call:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
通過obj.hide.call(window),我們將此時的內容物件改為window對象。call方法的第一個參數就是內容物件。
call方法也可以傳遞更多的參數,如下所示:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
另外apply方法跟call類型,它的第一個參數也是內容物件,不過後面的參數則是一個數組。如下所示:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
最後我們來看一個通過上下文,call和apply結合的例子。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">CssRain<p>TestTest<br />