Javascript This 上下文

2020-09-09 10:29 更新

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

有三个函数方法可以改变这个的值。

call()方法

call()函数可以通过运行来更改 this 上下文该函数具有特定的 this 值和特定参数。

call()的第一个参数是 this 应该指向的值到该函数被执行时。

所有后续参数都是应传递到函数中的参数。

例如,假设您更新writeLineForAll()以接受一个参数:

function writeLineForAll(label) { /*from  www.w3cschool.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"); 

上面的代码生成以下结果。


第一个函数调用使用全局变量,并在参数“global"中传递。

通过使用call()方法,我们不需要直接将函数添加到每个对象上。

apply()方法

apply()方法与call()相同,但它只接受两个参数:this的值和数组或类数组的对象参数传递给函数。

我们可以使用arguments对象作为第二个参数apply()方法。

function writeLineForAll(label) { //www.w3cschool.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"]);  

上面的代码生成以下结果。


bind()方法

bind()的第一个参数是新函数的 this 值。

所有其他参数表示应该是的命名参数在新功能中设置。

以下代码显示了使用bind()的两个示例。

我们通过将this值绑定到book1来创建writeLineForPerson1()函数writeLineForPerson2()将此绑定到book2并将第一个参数绑定为“book2"。

function writeLineForAll(label) { /* www.w3cschool.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");        

上面的代码生成以下结果。



以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号