免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
JavaScript—之對象參數(shù)的引用傳遞

 

1.JavaScript hoisting

 

>>請看例子,我們拿Chrome的console作為JS的運(yùn)行環(huán)境。

上面直接執(zhí)行console.log(a), 不帶一點(diǎn)懸念地拋出了not defined 錯(cuò)誤。這是預(yù)料之中的。

看下面進(jìn)化后的代碼:

之前變量沒有定義的錯(cuò)誤沒了,取而代之的是告訴我們a的值是 'undefined'。先不管a的值緣何為 'undefined' 了,至少可以知道現(xiàn)a這個(gè)變量是定義了,因?yàn)橹皥?bào)的' a is not defined'的錯(cuò)誤沒有了。

這正是因?yàn)镴avaScript 中的一個(gè)聲明提前的特性起的作用。

JavaScript中可以提前使用在后面語句中聲明的變量,這種特性叫被國外某網(wǎng)友(ben cherry)稱為Hoisting (非官方術(shù)語) 。 可以理解為將變量的聲明提前了,所以在變量聲明前使用變量不會(huì)報(bào)錯(cuò)。而且這一特性不僅限于變量名,對于函數(shù)的聲明也是同樣的效果。

第一次對函數(shù)foo()的調(diào)用同樣報(bào) 'not defined' 錯(cuò)誤。這是合情合理同時(shí)是合法的。因?yàn)閺念^到尾就沒有定義這么一個(gè)叫作foo() 的東西。

之后將函數(shù)調(diào)用寫在最前面,但函數(shù)的定義我們寫在了之后。

 

>> 再來看上面對a的輸出值為'undefined'的問題。

這里需要深入理解Hoisting這一特性。它的提前只是將聲明提前,而對變量的賦值并沒有跟著提前。這點(diǎn)很關(guān)鍵。也就是為什么我們可以在第一句使用變量a但它的值卻是 'undefined'。 JavaScript里面聲明了但還未賦值的變量其值默認(rèn)便是 'undefined'。

 

按照Hoisting來解釋,最終生成的等價(jià)代碼其實(shí)差不多應(yīng)該就是這樣的:

 

2.直接對字符串字面量調(diào)用其方法

 

可以直接對字符串字面量調(diào)用方法,JS解析器會(huì)自動(dòng)把字符串變量轉(zhuǎn)為一個(gè)字符串類型暫存,然后調(diào)用字符串上的方法,完了之后再將暫存的字符串類型銷毀。

所以你會(huì)看到下面這種用法。

我們可以理解為解析器在后臺(tái)聲明了一個(gè)變量暫存這個(gè)字符串然后再調(diào)用的length方法。

 

函數(shù)

 

1.匿名函數(shù)無法在聲明前調(diào)用

 

正如上面介紹的Hoisting特性,函數(shù)可以定義在調(diào)用之前也可以定義在調(diào)用之后:

但僅限于上述這種方式定義的函數(shù)。對于匿名函數(shù)上述規(guī)則不適用。

 

2. 參數(shù)變更影響到函數(shù)外部

 

當(dāng)傳遞給函數(shù)的參數(shù)是一個(gè)數(shù)組或?qū)ο髸r(shí),在函數(shù)體內(nèi)對這個(gè)傳入的參數(shù)的更改會(huì)影響到函數(shù)體外的原傳入值。

一般說來,對參數(shù)的更改不會(huì)影響到原來變量的值,更改只在函數(shù)體內(nèi)起作用:

上述代碼中,將name變量賦值為'Wayou Liu' 然后傳入change() 函數(shù)。在函數(shù)體內(nèi)將傳入的參數(shù)值改為'Liu Wayou'。然后再輸出,不出意外地,輸出的是變量原來的值'Wayou Liu'。因?yàn)楫?dāng)name傳入change函數(shù)后,在函數(shù)體內(nèi),相當(dāng)于有一個(gè)name的副本,這個(gè)副本的值等于name,之后在函數(shù)體內(nèi)對其做的操作是在這個(gè)副本上進(jìn)行的。

但情況有所不同,當(dāng)傳入的參數(shù)是數(shù)組、對象時(shí),在函數(shù)體內(nèi)對參數(shù)所做的更改會(huì)反映到原變量上。

可以看出,上面代碼中已經(jīng)把friut數(shù)組的第一個(gè)元素更改了。

下面是關(guān)于對象的例子:

可以很明顯地看到函數(shù)體內(nèi)對參數(shù)的改動(dòng)影響到了原來的變量,這與通常情況下的傳參有質(zhì)的區(qū)別了。需要特別注意。

But,當(dāng)在函數(shù)體內(nèi)對傳入的數(shù)組或?qū)ο筚x值時(shí),這個(gè)更改不會(huì)反映到函數(shù)體外的原變量身上!

請看:

按照上面函數(shù)內(nèi)部的更改會(huì)反映到原變量的理論,你肯定覺得執(zhí)行完change()后person變量的name屬性的值已經(jīng)變成'Tom'了吧。但結(jié)果讓人有點(diǎn)難以接受。

原因在于,當(dāng)在函數(shù)體內(nèi)使用賦值操作時(shí),系統(tǒng)就創(chuàng)建了一個(gè)變量名為p的變量。這個(gè)p是函數(shù)內(nèi)部的變量,對它進(jìn)行賦值當(dāng)然只在函數(shù)體內(nèi)起作用,外面的person還是原來的person。

這一步與原來代碼的操作差別僅在于在函數(shù)體內(nèi)是對參數(shù)賦新值呢還是對參數(shù)的屬性或數(shù)組的元素進(jìn)行更改。

 

3.使用arguments來接收個(gè)數(shù)未定的參數(shù)

 

有時(shí)候我們寫了個(gè)函數(shù)但它接收的參數(shù)個(gè)數(shù)不確定,有時(shí)候我們在調(diào)用一個(gè)函數(shù)的時(shí)候或許也不確定要傳多少個(gè)參數(shù)。參數(shù)需要變成動(dòng)態(tài)的。

這時(shí)可以通過函數(shù)內(nèi)arguments來接收傳遞到一個(gè)函數(shù)的所有參數(shù)。

具體說來,就是在函數(shù)體內(nèi)默認(rèn)有個(gè)arguments變量,它保存了調(diào)用這個(gè)函數(shù)時(shí)傳遞來的所有參數(shù),總個(gè)數(shù)及每個(gè)參數(shù)的值。它是一個(gè)類似于數(shù)組的變量,每個(gè)參數(shù)會(huì)成為它的一個(gè)元素,可以通過游標(biāo)來進(jìn)行訪問。

通過arguments.length可以知道參數(shù)個(gè)數(shù)。

下面這個(gè)例子來自MDN:

1
0
(請您對文章做出評價(jià))
上一篇:jQuery 綁定事件到動(dòng)態(tài)創(chuàng)建的元素上
下一篇:Chrome 控制臺(tái)新玩法-向輸出到console的文字加樣式
posted @ 2013-09-01 22:55 Wayou 閱讀(822) 評論(6) 編輯 收藏

  
#1樓 2013-09-01 23:51 | l_天水  
樓主標(biāo)題有問題,"JavaScript—之參數(shù)的引用傳遞",其實(shí)JavaScript中所有參數(shù)都是值傳遞的,<<javascript高級(jí)程序設(shè)計(jì)>>這本書里講過
http://demon.tw/programming/javascript-function-by-value-or-by-reference.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
二、JavaScript基本語法(1)
閱圣思園javascript后筆記
程序員裝X必備—19個(gè)JS簡寫技巧,讓你寫代碼速度翻倍!!
1. JavaScript 與 PHP 的語法區(qū)別
JavaScript
JavaScript01天學(xué)習(xí)筆記分享
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服