在 JavaScript 函數結構中,一般包含以下型別的識別符號。
-
函數引數。
-
arguments。
-
區域性變數。
-
內部函數。
-
this。
其中 this 和 arguments 是系統預設識別符號,不需要特別宣告。這些識別符號在函數體內的優先順序是(其中左側優先順序要大於右側):this > 區域性變數 > 形參 > arguments > 函數名。
範例1
下面範例將在函數結構內顯示函數結構的字串。
function f() { //定義函數
console.log(f); //提示函數結構
}
f(); //呼叫函數,返回函數f
範例2
如果定義形參 f,則同名情況下引數變數的優先順序會大於函數的優先順序。
function f(f) { //定義形參與函數同名
console.log(f); //提示識別符號f的值
}
f(true); //返回true,而不是函數f
範例3
比較形參與 arguments 屬性的優先順序。
function f(arguments) { //函數形參名與引數屬性arguments同名
console.log(typeof arguments); //提示引數的型別
}
f(true); //返回boolean,而不是屬性arguments的型別object
上面範例說明了形參變數會優於 arguments 屬性物件。
範例4
比較 arguments 屬性與函數名的優先順序。
function arguments() { //定義函數名與arguments屬性名相同
console.log(typeof arguments); //返回arguments的型別
}
arguments(); //返回arguments屬性的型別object
範例5
比較區域性變數和形參變數的優先順序。
function f(x) { //定義普通函數
var x = 10; //定義區域性變數並賦值
console.log(x); //顯示變數x的值
}
f(5); //傳遞引數值為5,返回提示為10
上面範例說明函數內區域性變數要優先於形參變數的值。
範例6
如果區域性變數沒有賦值,則會選擇形參變數。
function f(x) {
var x;
console.log(x);
}
f(5);
如果區域性變數與形參變數重名,區域性變數沒有賦值,則形參變數要優先於區域性變數。
範例7
下面範例演示當區域性變數與形參變數混在一起使用時的微妙關係。
function f(x) {
var x = x; //把形參x傳遞給區域性變數x
console.log(x);
}
f(5); //返回提示5
如果從區域性變數與形參變數之間的優先順序來看,則 var x = x 左右兩側都應該是區域性變數。由於 x 初始化值為 undefined,所以該表示式就表示把 undefined 傳遞給自身。但是從上面範例來看,這說明左側的是由 var 語句宣告的區域性變數,而右側的是形參變數。也就是說,當區域性變數沒有初始化時,應用的是形參變數優先於區域性變數。