国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

理解Javascript_14_函數(shù)形式參數(shù)與arguments

2019-11-21 00:11:35
字體:
供稿:網(wǎng)友
注:在閱讀本博文前請(qǐng)先閱讀《理解javascript_13_執(zhí)行模型詳解》
注:本文的部分內(nèi)容是自已的一些推論,并無官文文檔作依據(jù),如有錯(cuò)誤之后,還望指正。
生澀的代碼
我們先來看一段比較生澀的代碼:
復(fù)制代碼 代碼如下:

function say(msg,other,garbage){
alert(arguments[1]);//world
var other = 'nice to meet you!';
var msg;
alert(arguments.length);
alert(msg);//hello
alert(other);//nice to meet you!
alert(arguments[1]);//nice to meet you!
alert(garbage);//undefined
}
say('hello','world');

你能正確的解釋代碼的執(zhí)行結(jié)果嗎?思考一下.
  我想代碼運(yùn)行的結(jié)果,應(yīng)該會(huì)和你的想象有很大的出入吧!為什么msg正常輸出為hello,而不是undefined呢?函數(shù)定義的參數(shù)和函數(shù)內(nèi)部定義的變量重復(fù)了會(huì)發(fā)生什么呢?arguments和函數(shù)定義時(shí)的參數(shù)有什么關(guān)系呢?讓我們來一一解答:
簡(jiǎn)單的內(nèi)存圖

注:虛線表示的是曾經(jīng)引用的指向。

解答
  首先,我們來了解兩個(gè)概念,形式參數(shù)和實(shí)際參數(shù)。形式參數(shù)指的是定義方法時(shí)所明確指定的參數(shù),由于Javascript語言的靈活性,javascript并不要求方法調(diào)用時(shí),所傳遞的參數(shù)個(gè)數(shù)與形式參數(shù)一致.而javascript實(shí)際調(diào)用時(shí)所傳遞的參數(shù)就是實(shí)際參數(shù)。arguments指的就是實(shí)際參數(shù)。從say方法中可以看出,say定義了三個(gè)形式參數(shù),而實(shí)際調(diào)用時(shí)只傳遞了兩個(gè)值。因此arguments.length的值為2,而不是3.接著我們來看一下arguments的特殊行為,個(gè)人感覺arguments會(huì)將所有的實(shí)際參數(shù)都當(dāng)作對(duì)象來看待,對(duì)于基本數(shù)據(jù)類型的實(shí)際參數(shù)則會(huì)轉(zhuǎn)換為其對(duì)應(yīng)的對(duì)象類型。這是根據(jù)在函數(shù)內(nèi)定義與形式參數(shù)同名的變量并賦值,arguments對(duì)應(yīng)的值會(huì)跟著改變來判斷的。
接著我們來分析一下構(gòu)建say方法執(zhí)行上下文的過程,由于邏輯比較復(fù)雜,這里我寫一些'偽代碼'來進(jìn)行說明:
復(fù)制代碼 代碼如下:

function say(msg,other,garbage){
//先對(duì)函數(shù)聲明的變量進(jìn)行'預(yù)解析',內(nèi)部執(zhí)行流程,它是是不可見的
var msg = undefined;
var other = undefined;
var garbage = undefined;
//再對(duì)函數(shù)內(nèi)部定義的變量進(jìn)行'預(yù)解析'
var other = undefined;//很明顯,此時(shí)這個(gè)定義已經(jīng)無意義了。
var msg = undefined;//無意義
//對(duì)實(shí)際參數(shù)進(jìn)行賦值操作
msg = new String('hello');//arguments的會(huì)將所有實(shí)際參數(shù)當(dāng)作對(duì)象看待
other = new String('world');
//正式進(jìn)入函數(shù)代碼部分
alert(arguments[1]);//world
other = 'nice to meet you!';
//var msg;這個(gè)已經(jīng)被預(yù)解析了,因此不會(huì)再執(zhí)行
alert(arguments.length);//2
alert(msg);//hello
alert(other);//nice to meet you!
alert(arguments[1]);//nice to meet you!
alert(garbage);//undefined
}

這段代碼已經(jīng)可以解釋一面的所有的問題了。我就不多說了。
唯一強(qiáng)調(diào)的一點(diǎn)是在內(nèi)部用var定義與形式參數(shù)同名的變量是無意義的,因?yàn)樵诔绦?預(yù)解析'后,會(huì)將它們看作為同一個(gè)變量。

其它
關(guān)于arguments還有很多特性,我在《偽數(shù)組》一文中提到也提到了arguments,有興趣的讀者可以去看一下。arguments的實(shí)際應(yīng)用你還可以參考一下這一篇文章 :
http://www.gracecode.com/archives/2551/

好了,也就這么多了。希望大家能多多指正,多提意見吧。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 栖霞市| 绥化市| 东丽区| 富顺县| 潮州市| 闸北区| 曲靖市| 滨海县| 芜湖市| 济宁市| 天水市| 镇江市| 贵溪市| 铜梁县| 乃东县| 雷州市| 嘉禾县| 正阳县| 句容市| 夏邑县| 九寨沟县| 凭祥市| 扶绥县| 石渠县| 巴里| 弥渡县| 宁安市| 江口县| 轮台县| 城市| 彩票| 黔东| 高雄县| 易门县| 婺源县| 龙口市| 临夏县| 巨鹿县| 淮阳县| 绥芬河市| 托克逊县|