天天看點

javascript(arguments)

今天去做了金山網絡招聘實習生的試卷,有一道題目确實讓我有點在當時不太肯定,畢竟自己的腦袋還不是javascript解析器,然後回來就打開chrome的控制台,運作後就覺得自己要去總結這個知識點了。

function foo(a,b,c){

c = 3;

console.log(arguments);

}

foo(1,2)

foo(1,2,undefined)

确實當時看見這道題目的時候,心裡還是有很多疑問的,最後隻能歸結成一個是arguments對象是什麼時候才指派?

<dl></dl>

<dt>arguments的基本資訊</dt>

<dd>1 它不是真正的數組,隻是一個類數組的對象,具體兩者有什麼差別,這個不是我們這篇文章了解的重點;</dd>

<dd>2 它建立于函數定義,并設定為null,指派于函數調用,它是一個指向函數的參數清單的引用,是函數體通路形參的接口</dd>

<dd>3 它隻能作用于該函數的函數體,在外界通路這個對象會出錯或者隻是null</dd>

<dt>arguments奇葩行為</dt>

<dd>1 因為它是類數組的對象,它具有一個length屬性還有就是可以用下标來通路參數清單</dd>

<dd></dd>

2 因為它是函數的屬性,如果你在函數體中重新定義一個arguments變量,它會覆寫原來的arguments

代碼:

var arguments = 1;

結果:1

3 在非嚴格的情況下,我們可以通過arguments來修改參數清單

arguments[0] = "monkindey";

console.log(a);

結果:"monkindey"

那好吧,我們還是揭秘金山實習生招聘的筆試題

<dt>foo(1,2)</dt>

<dd>答案:[1,2]</dd>

原因:arguments标示符在《javascript權威指南》中指出,它是指向實參對象的引用。實參對象是一個類數組,當實參對象改,那麼arguments也會跟着改。而實參對象隻有在函數調用時才指派,比如上面實參對象就類似于{a:1,b:2},但是沒有c,是以給c指派,改變不了實參對象,而arguments是它的引用,是以它也沒影響。

<dt>foo(1,2,undefined)</dt>

<dd>答案:[1,2,3]</dd>

原因:實參對象會是{a:1,b:2,c:undefined},而在函數體中再修改c的話,就會設定實參對象中的c為3。是以console.log(arguments)會變成[1,2,3]

<dt>函數内部聲明的局部變量與形參同名</dt>

var a = 3;

console.log(arguments[0]);

答案:3

原因:個人覺得當我們調用一個函數,傳入進去的實參,就是給一個函數中的形參指派,其實相當于在函數定義一個局部變量,變量名就是那個形參名,上面的代碼可以看成

var a = 1;//傳入實參的形參相當于在函數體中定義一個局部變量

<dt>如果隻是聲明局部變量a,卻不指派,情況又不一樣了</dt>

var a ;

答案:1

原因:上面的代碼可以看成

var a ;//重複定義一個變量但是又不指派,javascript解析器會把它忽略掉的(我的猜想)

繼續閱讀