本文共 635 字,讀完只需 3 分鐘
概述
JavaScript中的函式與其他面嚮物件語言有幾個不同的地方。
- 沒有函式過載
- 有一個表示實參列表的類陣列物件 arguments
一、函式過載
簡單來說,JAVA 同一個類中允許幾個函式有同樣的函式名稱,但是引數宣告不一樣,這就是函式過載。
但是 JS 不支援函式過載:
function foo(num) {
console.log(num + 100)
}
function foo(num) {
console.log(num + 200)
}
foo(100); // 300
複製程式碼
如果 js 中定義了兩個相同名稱的函式,那麼該名字只屬於後定義的那個函式。
二、arguments 類陣列
函式 arguments 物件是所有(非箭頭)函式中都可用的區域性變數, 是一個類似陣列的物件。你可以使用arguments物件在函式中引用函式的(實際)引數。
function foo() {
console.log(arguments);
}
foo(1, "foo", false, {name: "bar"}); // [1, "foo", false, object]
複製程式碼
function foo() {
console.log(typeof arguments);
}
foo(1, "foo", false, {name: "bar"}); // object
複製程式碼
所以,arguments 是一個具有陣列樣式的物件,有 length 屬性,和下標來索引元素。
三、arguments 的屬性
length
function foo(num1, num2, num3) {
console.log(arguments)
}
foo(1); // [1]
複製程式碼
length 屬性表示傳入函式的實際引數數量,而不是函式宣告時的形引數量。
callee
callee 表示函式本身,我們可以在函式中通過 callee 呼叫本身。
複製程式碼
四、轉化為真陣列
- slice
arguments 物件不支援陣列的其他方法,但是可以用 Function.call 來間接呼叫。
function sayHi() {
console.log(Array.prototype.slice.call(arguments, 0))
}
sayHi("hello", "你好", "bonjour") //["hello", "你好", "bonjour"]
複製程式碼
- splice
function sayHi() {
console.log(Array.prototype.splice.call(arguments, 0));
}
sayHi("hello", "你好", "bonjour") //["hello", "你好", "bonjour"]
複製程式碼
- Array.from
function sayHi() {
console.log(Array.from(arguments));
}
sayHi("hello", "你好", "bonjour") //["hello", "你好", "bonjour"]
複製程式碼
- 擴充套件運算子
function sayHi(...arguments) {
console.log(arguments);
}
sayHi("hello", "你好", "bonjour") //["hello", "你好", "bonjour"]
複製程式碼
五、嚴格模式
嚴格模式和非嚴格模式中,arguments 的表現顯示不相同。
// 嚴格模式
function foo(a, b) {
"use strict";
console.log(a, arguments[0]);
a = 10;
console.log(a, arguments[0]);
arguments[0] = 20;
console.log(a, arguments[0]);
b = 30;
console.log(b, arguments[1])
}
foo(1);
輸出:
1 1
10 1
10 20
30 undefined
// 非嚴格模式
function foo(a, b) {
console.log(a, arguments[0]);
a = 10;
console.log(a, arguments[0]);
arguments[0] = 20;
console.log(a, arguments[0]);
b = 30;
console.log(b, arguments[1]);
}
foo(1);
輸出:
1 1
10 10
20 20
30 undefined
複製程式碼
在非嚴格模式中,傳入的引數,實參和 arguments 的值會共享,當沒有傳入時,實參與 arguments 值不會共享。
而在嚴格模式中,實參和 arguments 的值不會共享。
歡迎關注我的個人公眾號“謝南波”,專注分享原創文章。