1. 程式人生 > >騰訊面試題-----JavaScript中arguments物件解析

騰訊面試題-----JavaScript中arguments物件解析


在騰訊面試中遇到了這樣問題:

js程式碼
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程式碼
 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程式碼
 function f2(a) {    
       alert(a);    
        arguments[0] = 1;//修改arguments    
        alert(1 === a);    
        alert(1 === arguments[0]);    
            
    }    

效果同f1。

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可以證明。


如果只是宣告區域性變數a,卻不賦值,情況又不一樣了

Js程式碼

 function f3(a) {    
        var a;//僅宣告,不賦值    
        alert(a);    
        alert(arguments[0]);    
    }    
    f3(10);    

這時候彈出的都是10,而不是undefined

結論:永遠不要去修改傳入引數,不僅程式難讀,而且難以查詢的bug