10.call、apply和arguments
阿新 • • 發佈:2022-03-27
call、apply和arguments
call()和apply()
這兩個方法都是函式物件的方法,需要通過函式物件來呼叫
當對函式呼叫 call()
和apply()
都會呼叫函式執行
var obj = {
name: "obj"
};
var obj2 = {
name:"obj2"
}
function fun(){
console.log(this.name);
}
fun.call(obj); // obj
fun.call(obj2); // obj2
在呼叫call()
和apply()
可以將一個物件指定為第一個引數此時這個物件將會成為函式執行時的this
call()
apply()
方法需要將實參封裝到一個數組中統一傳遞
function fun(a, b){
console.log("a = " + a + ", b = " + b);
}
fun.call(obj, 2, 3); // a = 2, b = 3
fun.apply(obj, [2, 3]); // a = 2, b = 3
this的情況
- 以函式的形式呼叫時,
this
永遠都是window
- 以方法的形式呼叫時,
this
是呼叫方法的物件 - 以建構函式的形式呼叫時,
this
是新建立的那個物件 - 使用
call
和apply
呼叫時,this
是指定的那個物件
arguments
在呼叫函式時,瀏覽器每次都會傳遞進兩個隱含的引數:
- 函式的上下文物件
this
- 封裝實參的物件
arguments
arguments
是一個類陣列物件(並非陣列),可以通過索引來操作資料,也可以獲取長度
function fun1(){
console.log(arguments instanceof Array); // false
console.log(Array.isArray(arguments)); // false
}
fun1();
在呼叫函式時,我們所傳遞的實參都會在arguments
中儲存
我們即使不定義形參,也可以通過arguments
來使用實參,只不過比較麻煩
arguments[0]
表示第一個實參arguments[1]
表示第二個實參
function fun2(a,b,c){
console.log("arguments.length = " + arguments.length + ", arguments[0] = " + arguments[0]);
}
fun2("hello"); // arguments.length = 1, arguments[0] = hello
fun2(true, "hello"); // arguments.length = 2, arguments[0] = true
它裡邊有一個屬性叫做callee
,這個屬性對應一個函式物件,就是當前正在執行的函式物件
function fun3(){
console.log(arguments.callee);
// function fun3(){
// console.log(arguments.callee);
// }
console.log(arguments.callee == fun3); // true
}
fun3();