在騰訊面試中遇到了這樣問題:面試
- function test(x,y){
- var x = 10;
- alert(arguments[0],arguments[1]);
- }
- test();
獲取arguments數據 Array.prototype.slice.call(arguments,1),返回一個數組[];
輸出結果是什麼?
這道題目主要是爲了區分js中的形參和實參,取得函數形參方法是arguments.callee.length,實參是arguments.length。
arguments[0],arguments[1] 取得是什麼結果吶?
arguments[0],arguments[1] :主要是用來取得用戶在調用test函數時候實際傳遞參數,
test函數指望的是2個參數,可是用戶調用的時候沒有給定實際實參,因此輸出結果是undefined,undefined可是若是這樣調用 test(1),那麼輸出將會是1,爲何結果是10而不是傳入的參數值1吶?是函數內部的優先級?仍是函數內部的局部變量覆蓋了實參x?但願大牛的指點?數組
借用別人的解釋:
1,直接修改函數聲明時的形參
Js代碼ide
- function f1(a) {
- alert(a);
- a = 1;//修改形參a
- alert(1 === a);
- alert(1 === arguments[0]);
- }
- f1(10);
函數f1定義了參數a,調用時傳參數10,先彈出10,修改a爲1,彈出兩次true,a和arguments[0]都爲1了。函數
2,經過函數內部的arguments對象修改
Js代碼spa
- function f2(a) {
- alert(a);
- arguments[0] = 1;//修改arguments
- alert(1 === a);
- alert(1 === arguments[0]);
- }
效果同f1。prototype
3,函數內部聲明的局部變量與形參同名
Js代碼對象
- function f3(a) {
- alert(a);
- var a = 1;//聲明局部變量a且賦值爲1
- alert(1 === a);
- alert(arguments[0]);
- }
- f3(10);
函數f3定義了形參a,函數內部聲明局部變量a同時賦值爲1,但這裏的a仍然是參數a,從最後彈出的arguments[0]被修改成1能夠證實。it
若是隻是聲明局部變量a,卻不賦值,狀況又不同了
Js代碼io
- function f3(a) {
- var a;//僅聲明,不賦值
- alert(a);
- alert(arguments[0]);
- }
- f3(10);
這時候彈出的都是10,而不是undefined
結論:永遠不要去修改傳入參數,不只程序難讀,並且難以查找的bugfunction