JavaScript 中級(jí)筆記 第三章
更新時(shí)間:2009年09月14日 13:26:04 作者:
接著(2)來(lái)講。筆記(2)已經(jīng)講了引用和函數(shù)重載,接下來(lái)講解作用域。
3,作用域
所有的面向?qū)ο蟮恼Z(yǔ)言都有某種形式的作用域,JavaScript也不例外。在JavaScript里,作用域是由函數(shù)劃分的,而不是由塊(while,if之類(lèi)的)來(lái)劃分的。
我們先來(lái)看一個(gè)簡(jiǎn)單的作用域的例子。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
在if塊中,雖然foo的值改為“b“,但還是在全局作用域中,所以輸出結(jié)果是“b“。
基于瀏覽器的JavaScript語(yǔ)言有一門(mén)有趣的特性是,所有屬于全局作用域的變量都是window對(duì)象的屬性。
看下面代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
我們?cè)偕侠幕A(chǔ)上,再添加一個(gè)函數(shù)來(lái)修改foo的值,代碼如下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
結(jié)果也許有點(diǎn)另你意外,不過(guò)結(jié)果肯定是正確的。代碼②的結(jié)果是輸出 "b",而不是"c"。原因就是作用域有關(guān),雖然調(diào)用change()來(lái)改變foo的值,但是此時(shí)的改變只
在函數(shù)作用域內(nèi)起作用,并不會(huì)改變?nèi)肿饔糜騼?nèi)的foo的值。
如果想在change()函數(shù)內(nèi)修改全局的foo的值,我們可以去掉變量的聲明,例如:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
在JavaScript中,如果變量沒(méi)有顯式定義,它就是全局定義的。所以調(diào)用change()后,會(huì)修改全局foo的值。最終輸出"c" 。
4,上下文對(duì)象
在JavaScript中,代碼總是有一個(gè)上下文對(duì)象,代碼處于該對(duì)象之內(nèi)。上下文對(duì)象是通過(guò)this變量來(lái)體現(xiàn)的。這個(gè)變量永遠(yuǎn)指向當(dāng)前代碼所處的對(duì)象中。
全局對(duì)象其實(shí)是window對(duì)象的屬性。
接下來(lái),我們看一個(gè)上下文對(duì)象的例子。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
再此基礎(chǔ)上,我們?cè)倏匆粋€(gè)例子:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
本例中,我們把obj.hide變量的上下文對(duì)象變?yōu)閣indow對(duì)象時(shí),代碼寫(xiě)得并不好理解。幸運(yùn)的是,JavaScript提供了一套更好的方法來(lái)解決。
現(xiàn)在我們有請(qǐng)call和apply兩位先生上場(chǎng),通過(guò)它們也可以完成同樣的功能。先看call:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
通過(guò)obj.hide.call(window),我們將此時(shí)的上下文對(duì)象改為window對(duì)象。call方法的第一個(gè)參數(shù)就是上下文對(duì)象。
call方法也可以傳遞更多的參數(shù),如下所示:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
另外apply方法跟call類(lèi)型,它的第一個(gè)參數(shù)也是上下文對(duì)象,不過(guò)后面的參數(shù)則是一個(gè)數(shù)組。如下所示:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
最后我們來(lái)看一個(gè)通過(guò)上下文,call和apply結(jié)合的例子。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
在setBodyColor函數(shù)中,apply的第二個(gè)參數(shù)是數(shù)組,而前面我們講過(guò),arguments 也是一個(gè)偽數(shù)組,那么它們2個(gè)能聯(lián)系起來(lái)嗎?
把 changeColor.apply( document.body , ["blue"]); 改為 changeColor.apply( document.body , arguments );,
然后給setBodyColor();函數(shù)傳參數(shù)。如下代碼所示:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
通過(guò)這些例子,你也許對(duì)上下文的概念比較熟悉了。上下文在面向?qū)ο蟮木幊讨蟹浅V匾?
所有的面向?qū)ο蟮恼Z(yǔ)言都有某種形式的作用域,JavaScript也不例外。在JavaScript里,作用域是由函數(shù)劃分的,而不是由塊(while,if之類(lèi)的)來(lái)劃分的。
我們先來(lái)看一個(gè)簡(jiǎn)單的作用域的例子。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
在if塊中,雖然foo的值改為“b“,但還是在全局作用域中,所以輸出結(jié)果是“b“。
基于瀏覽器的JavaScript語(yǔ)言有一門(mén)有趣的特性是,所有屬于全局作用域的變量都是window對(duì)象的屬性。
看下面代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
我們?cè)偕侠幕A(chǔ)上,再添加一個(gè)函數(shù)來(lái)修改foo的值,代碼如下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
結(jié)果也許有點(diǎn)另你意外,不過(guò)結(jié)果肯定是正確的。代碼②的結(jié)果是輸出 "b",而不是"c"。原因就是作用域有關(guān),雖然調(diào)用change()來(lái)改變foo的值,但是此時(shí)的改變只
在函數(shù)作用域內(nèi)起作用,并不會(huì)改變?nèi)肿饔糜騼?nèi)的foo的值。
如果想在change()函數(shù)內(nèi)修改全局的foo的值,我們可以去掉變量的聲明,例如:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
在JavaScript中,如果變量沒(méi)有顯式定義,它就是全局定義的。所以調(diào)用change()后,會(huì)修改全局foo的值。最終輸出"c" 。
4,上下文對(duì)象
在JavaScript中,代碼總是有一個(gè)上下文對(duì)象,代碼處于該對(duì)象之內(nèi)。上下文對(duì)象是通過(guò)this變量來(lái)體現(xiàn)的。這個(gè)變量永遠(yuǎn)指向當(dāng)前代碼所處的對(duì)象中。
全局對(duì)象其實(shí)是window對(duì)象的屬性。
接下來(lái),我們看一個(gè)上下文對(duì)象的例子。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
再此基礎(chǔ)上,我們?cè)倏匆粋€(gè)例子:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
本例中,我們把obj.hide變量的上下文對(duì)象變?yōu)閣indow對(duì)象時(shí),代碼寫(xiě)得并不好理解。幸運(yùn)的是,JavaScript提供了一套更好的方法來(lái)解決。
現(xiàn)在我們有請(qǐng)call和apply兩位先生上場(chǎng),通過(guò)它們也可以完成同樣的功能。先看call:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
通過(guò)obj.hide.call(window),我們將此時(shí)的上下文對(duì)象改為window對(duì)象。call方法的第一個(gè)參數(shù)就是上下文對(duì)象。
call方法也可以傳遞更多的參數(shù),如下所示:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
另外apply方法跟call類(lèi)型,它的第一個(gè)參數(shù)也是上下文對(duì)象,不過(guò)后面的參數(shù)則是一個(gè)數(shù)組。如下所示:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
最后我們來(lái)看一個(gè)通過(guò)上下文,call和apply結(jié)合的例子。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
在setBodyColor函數(shù)中,apply的第二個(gè)參數(shù)是數(shù)組,而前面我們講過(guò),arguments 也是一個(gè)偽數(shù)組,那么它們2個(gè)能聯(lián)系起來(lái)嗎?
把 changeColor.apply( document.body , ["blue"]); 改為 changeColor.apply( document.body , arguments );,
然后給setBodyColor();函數(shù)傳參數(shù)。如下代碼所示:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
通過(guò)這些例子,你也許對(duì)上下文的概念比較熟悉了。上下文在面向?qū)ο蟮木幊讨蟹浅V匾?
相關(guān)文章
javascript過(guò)濾數(shù)組重復(fù)元素的實(shí)現(xiàn)方法
這篇文章主要介紹了javascript過(guò)濾數(shù)組重復(fù)元素的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-05-05JavaScript中如何使用cookie實(shí)現(xiàn)記住密碼功能及cookie相關(guān)函數(shù)介紹
cookie是網(wǎng)站設(shè)計(jì)者放置在客戶(hù)端(瀏覽器)的小文本文件,cookie不僅能夠?qū)崿F(xiàn)保存密碼功能,還可以通過(guò)cookie保存最近瀏覽記錄增加用戶(hù)體驗(yàn)。本文給大家介紹js使用cookie實(shí)現(xiàn)記住密碼功能及cookie相關(guān)函數(shù)講解,感興趣的朋友一起看看吧2016-11-11關(guān)于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
下面小編就為大家?guī)?lái)一篇關(guān)于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06BetterScroll 在移動(dòng)端滾動(dòng)場(chǎng)景的應(yīng)用
BetterScroll 是一款重點(diǎn)解決移動(dòng)端各種滾動(dòng)場(chǎng)景需求的開(kāi)源插件( GitHub地址 ),非常不錯(cuò),下面腳本之家小編給大家分享BetterScroll 在移動(dòng)端滾動(dòng)場(chǎng)景的應(yīng)用,一起看看吧2017-09-09javascript定義變量時(shí)帶var與不帶var的區(qū)別分析
這篇文章主要介紹了javascript定義變量時(shí)帶var與不帶var的區(qū)別,以一個(gè)簡(jiǎn)單實(shí)例分析了變量定義時(shí)帶var與不帶var的執(zhí)行原理及用法區(qū)別,需要的朋友可以參考下2015-01-01