函數上 下文
在Java或者C/C++等 語言中,方法(函數)只能依附於對象而存在,不是獨立的。而在JavaScript中, 函
數也是一種對象,並非其他任何對象的一部分,理解這一點尤爲重要,特別是對理解函數式的JavaScript
非 常有用,在函數式編程語言中,函數被認爲是一等的。
函數的上下文是可以變化的,因此,函數 內的this也是可以變化的,函數可以作爲一個對象的方法,也可
以同時 作爲另一個對象的方法,總之,函數本身是獨立的。可以通過Function對 象上的call或者apply函
數來修改函數的上下文:
call和apply
call和apply通常用來修改函數的上下文,函數中的this指針將被替換爲call或 者apply的第一個參數
Js代碼
//定義一個人,名字爲jack
var jack = {
name : "jack",
age : 26
}
//定義另一個人,名字爲abruzzi
var abruzzi = {
name : "abruzzi",
age : 26
}
//定義一個全局的函數對象
function printName(){
return this.name;
}
//設置printName的上下文爲jack, 此時的this爲jack
print(printName.call(jack));
//設置printName的上下文爲abruzzi,此時的this爲abruzzi
print(printName.call(abruzzi));
print(printName.apply(jack));
print(printName.apply(abruzzi));
只有一個參數的時候call和apply的使用方式是一樣的,如果有多個參數:
Js代碼
setName.apply(jack, ["Jack Sept."]);
print(printName.apply(jack));
setName.call(abruzzi, "John Abruzzi");
print(printName.call(abruzzi));
setName.apply(jack, ["Jack Sept."]); print(printName.apply(jack));
setName.call(abruzzi, "John Abruzzi"); print(printName.call(abruzzi));
得到的結果爲:
Js代碼
Jack Sept.
John Abruzzi
Jack Sept. John Abruzzi
apply的 第二個