本文共 635 字,讀完只需 3 分鐘javascript
JavaScript中的函數與其餘面嚮對象語言有幾個不一樣的地方。java
簡單來講,JAVA 同一個類中容許幾個函數有一樣的函數名稱,可是參數聲明不同,這就是函數重載。數組
可是 JS 不支持函數重載:閉包
function foo(num) {
console.log(num + 100)
}
function foo(num) {
console.log(num + 200)
}
foo(100); // 300
複製代碼
若是 js 中定義了兩個相同名稱的函數,那麼該名字只屬於後定義的那個函數。app
函數 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 屬性,和下標來索引元素。post
lengthui
function foo(num1, num2, num3) {
console.log(arguments)
}
foo(1); // [1]
複製代碼
length 屬性表示傳入函數的實際參數數量,而不是函數聲明時的形參數量。this
callee
callee 表示函數自己,咱們能夠在函數中經過 callee 調用自己。spa
複製代碼
arguments 對象不支持數組的其餘方法,可是能夠用 Function.call 來間接調用。
function sayHi() {
console.log(Array.prototype.slice.call(arguments, 0))
}
sayHi("hello", "你好", "bonjour") //["hello", "你好", "bonjour"]
複製代碼
function sayHi() {
console.log(Array.prototype.splice.call(arguments, 0));
}
sayHi("hello", "你好", "bonjour") //["hello", "你好", "bonjour"]
複製代碼
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 的值不會共享。
歡迎關注個人我的公衆號「謝南波」,專一分享原創文章。