我們可以更改此值以指向不同的上下文。
有三個(gè)函數(shù)方法可以改變這個(gè)的值。
call()
函數(shù)可以通過運(yùn)行來更改 this
上下文該函數(shù)具有特定的 this
值和特定參數(shù)。
call()
的第一個(gè)參數(shù)是 this
應(yīng)該指向的值到該函數(shù)被執(zhí)行時(shí)。
所有后續(xù)參數(shù)都是應(yīng)傳遞到函數(shù)中的參數(shù)。
例如,假設(shè)您更新writeLineForAll()以接受一個(gè)參數(shù):
function writeLineForAll(label) { /*from hgci.cn */
console.log(label + ":" + this.name);
}
var book1 = {
name : "Javascript"
};
var book2 = {
name : "CSS"
};
var name = "W3Cschool";
writeLineForAll.call(this, "global");
writeLineForAll.call(book1, "book1");
writeLineForAll.call(book2, "book2");
上面的代碼生成以下結(jié)果。
第一個(gè)函數(shù)調(diào)用使用全局變量,并在參數(shù)“global"中傳遞。
通過使用call()方法,我們不需要直接將函數(shù)添加到每個(gè)對(duì)象上。
apply()
方法與call()相同,但它只接受兩個(gè)參數(shù):this的值和數(shù)組或類數(shù)組的對(duì)象參數(shù)傳遞給函數(shù)。
我們可以使用arguments對(duì)象作為第二個(gè)參數(shù)apply()方法。
function writeLineForAll(label) { //hgci.cn
console.log(label + ":" + this.name);
}
var book1 = {
name : "Javascript"
};
var book2 = {
name : "CSS"
};
var name = "W3Cschool";
writeLineForAll.apply(this, ["global"]);
writeLineForAll.apply(book1, ["book1"]);
writeLineForAll.apply(book2, ["book2"]);
上面的代碼生成以下結(jié)果。
bind()
的第一個(gè)參數(shù)是新函數(shù)的 this
值。
所有其他參數(shù)表示應(yīng)該是的命名參數(shù)在新功能中設(shè)置。
以下代碼顯示了使用bind()的兩個(gè)示例。
我們通過將this值綁定到book1來創(chuàng)建writeLineForPerson1()函數(shù)writeLineForPerson2()將此綁定到book2并將第一個(gè)參數(shù)綁定為“book2"。
function writeLineForAll(label) { /* hgci.cn*/
console.log(label + ":" + this.name);
}
var book1 = {
name : "Javascript"
};
var book2 = {
name : "CSS"
};
// create a function just for book1
var writeLineForPerson1 = writeLineForAll.bind(book1);
writeLineForPerson1("book1");
// create a function just for book2
var writeLineForPerson2 = writeLineForAll.bind(book2, "book2");
writeLineForPerson2();
// attaching a method to an object doesn"t change "this"
book2.writeLine = writeLineForPerson1;
book2.writeLine("book2");
上面的代碼生成以下結(jié)果。
更多建議: