JavaScript 中級筆記 第三章

來源:互聯網
上載者:User

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 />

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.