Javascript This 上下文

2020-09-09 10:29 更新

我們可以更改此值以指向不同的上下文。

有三個(gè)函數(shù)方法可以改變這個(gè)的值。

call()方法

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()方法

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()方法

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é)果。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)