1. 程式人生 > >關於為函數形參賦值和搜索變量標識符的雲雲

關於為函數形參賦值和搜索變量標識符的雲雲

info 吐槽 body 建議 blank 代碼檢查 聲明 ren 技術

為形參提供默認值是以前的一種流行方法:

function foo(a){
    a=a||1;
    console.log(a);
}

foo();     // 1
foo(12);  // 12

你看,如果函數調用時不提供實參,形參a會被賦1。另:最好不要修改形參,參見竟然修改形參有這麽可怕的後果。

形參本身是局部變量,只能在函數內訪問:

function foo(a){
    console.log(a);
}

foo(12);   // 12

console.log(a);  // Uncaught ReferenceError: a is not defined

比如,你可以這樣:

function foo(){
    a=‘lala‘;
}

foo();

console.log(a);  // lala

引擎在foo函數的作用域和全局作用域找不到名為a的變量,在非嚴格模式下就會在全局作用域創建一個名為a的全局變量,此時如果為函數添加名為a的形參就可以

阻止這種事情發生:

function foo(a){
    a=‘lala‘;
}

foo();

console.log(a);  // Uncaught ReferenceError: a is not defined

因為引擎已經在函數的作用域內找到了名為a的變量,所以不會在全局作用域創建名為a的全局變量,此時,如果再在函數內聲明名為a的變量就已經是重復聲明了:

function foo(a){
    var a=‘lala‘;
    console.log(a);
}

foo();  // lala

此時JShint等代碼檢查工具就會警告:

技術分享圖片

雖然JS的重復聲明會被引擎忽略,但不建議這麽做。

最後,我真想吐槽博客園的光標,特麽的怎麽總是莫名其妙跳到別處!害得總是修改原來寫好的代碼!

以上。

關於為函數形參賦值和搜索變量標識符的雲雲