在騰訊面試中遇到了這樣問題:
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