javascript中函數的參數與arguments關係

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

 

  
  
           
  
  
  1. function test(x,y){   
  2.   var x = 10;   
  3.   alert(arguments[0],arguments[1]);   
  4. }   
  5.    
  6. 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

 

  
  
           
  
  
  1. function f1(a) {   
  2.     alert(a);   
  3.     a = 1;//修改形參a   
  4.     alert(1 === a);   
  5.     alert(1 === arguments[0]);   
  6. }   
  7. f1(10);  

 

函數f1定義了參數a,調用時傳參數10,先彈出10,修改a爲1,彈出兩次true,a和arguments[0]都爲1了。函數

 

2,經過函數內部的arguments對象修改

Js代碼spa

 

  
  
           
  
  
  1. function f2(a) {   
  2.     alert(a);   
  3.     arguments[0] = 1;//修改arguments   
  4.     alert(1 === a);   
  5.     alert(1 === arguments[0]);   
  6.        
  7. }  

效果同f1。prototype

 

3,函數內部聲明的局部變量與形參同名


Js代碼對象

 

  
  
           
  
  
  1. function f3(a) {   
  2.     alert(a);   
  3.     var a = 1;//聲明局部變量a且賦值爲1   
  4.     alert(1 === a);   
  5.     alert(arguments[0]);   
  6. }   
  7. f3(10);  

函數f3定義了形參a,函數內部聲明局部變量a同時賦值爲1,但這裏的a仍然是參數a,從最後彈出的arguments[0]被修改成1能夠證實。it

 

若是隻是聲明局部變量a,卻不賦值,狀況又不同了

Js代碼io

 

  
  
           
  
  
  1. function f3(a) {   
  2.     var a;//僅聲明,不賦值   
  3.     alert(a);   
  4.     alert(arguments[0]);   
  5. }   
  6. f3(10);  

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

結論:永遠不要去修改傳入參數,不只程序難讀,並且難以查找的bugfunction

相關文章
相關標籤/搜索