JS函數內部識別符號的使用順序

2020-07-16 10:05:03
在 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 語句宣告的區域性變數,而右側的是形參變數。也就是說,當區域性變數沒有初始化時,應用的是形參變數優先於區域性變數。