Js中一个非常重要且具有动态属性的概念:this关键字在JavaScript中,this关键字是一个非常重要且有时可能引
Js中的this
在JavaScript中,this
关键字是一个非常重要且有时可能引起混淆的概念。它通常指向函数执行时的上下文对象,但具体指向什么取决于函数的调用方式。简单来说,它在不同的执行环境下指向不同的对象。
this的不同指向:
1.在全局上下文或普通函数直接调用中,应用this的默认绑定规则
在全局上下文中,this
会被默认绑定到全局对象,也就是指向全局对象(在浏览器中通常是window)。
var a = 1
console.log(this.a);
我们在浏览器中打开并运行这段代码,可以得到如下结果:
我们发现:因为
a
是定义在全局的变量,而在全局上下文中this
指向全局对象(window),所以当访问this.a
时,js引擎就会在全局对象中找到变量a
,并打印出来。
同样的,在普通函数调用中,如下代码:
var a = 1
function foo(){
//"use strict";
var b = 2
console.log(this.b);
}
foo()
因为foo()
是直接使用不带任何修饰的函数引用进行调用的,所以此时this
同样被默认绑定到全局对象(指向全局对象),所以在浏览器中此时运行结果为1
。
但是有一个特例!!如果使用严格模式(如被注释的第三行代码),则不能将全局对象用于默认绑定,因此this会绑定到undefined
。
2.在对象方法中,应用this的隐式绑定规则
当函数作为某个对象的方法被调用时,this
的隐式绑定规则会把this
绑定到(指向)该对象
let obj = {
name: 'Alice',
sayHello: function() {
console.log(this.name);
}
}
obj.sayHello()
此时, function() { console.log(this.name)}
函数作为对象obj的sayHello
方法被调用时,隐式绑定规则会把函数调用中的this
绑定到对象obj
,所以此时this.a
和obj.a
是一样(相等)的。所以this
指向该对象,所以会打印出对象中的name
属性的值‘Alice’。
3.在构造函数或类的方法中,应用this的new绑定规则
当使用new
关键字调用构造函数时,new绑定规则会把this
绑定到(指向)新创建的实例对象
function foo(a){
this.a = a;
}
var bar = new foo(2);
console.log(bar.a);
在这段代码中,使用new
来调用foo()
时,我们会构造一个新对象并把它绑定到foo()
调用中的this
上,所以这时的this
就指向新创建的实例对象。所以此时代码结果为2
。
4.call,apply,bind方法设置this的值,this的显式绑定
在js中,允许使用.call()
, .apply()
, .bind()
方法设置this的绑定(指向)。它们之间最明显的区别就是,call
和apply
方法是立即调用函数,而bind
方法返回一个新函数。
function foo(){
console.log.(this.a);
}
var obj = {
a : 2
};
foo.call(obj); // 2
//foo.apply(obj); // 2
当一个函数调用.call()
或.apply()
方法时,这个函数中的this
会被强制绑定到()中的对象上,所以此时foo
中的this
就指向obj
。如果()中传入的是一个原始值(字符串类型,布尔类型或者数字类型),这个原始值会被转换成它的对象形式。
但如果调用的是.bind()
方法,则会返回一个新函数,我们需要先接收这个新函数。
function foo(){
console.log.(this.b);
}
var newObj = {
b : 5
};
const Foo = foo.bind(newObj);
Foo(); // 5
这里使用.bind()
方法this
仍然会指向()中的对象,但我们须先用Foo
接收.bind()
方法返回的新函数,再调用Foo
即可。
5.箭头函数中的this指向
在Js的ES6版本中介绍了一种无法使用以上规则的特殊函数类型:箭头函数,它并不是使用function
关键字定义的,而是使用被称为“胖箭头”的操作符 =>
定义的。
箭头函数不会创建自己的this
值,它会继承外层非箭头函数中的this
值,如果外层还是箭头函数,那么会一直往外层找,直到找到全局为止。
var obj = {
a : 1,
foo : functiono(){
const fn = () =>{
console.log(this.a);
}
fn()
}
}
obj.foo() // 1
结束
最后简单总结一下:
1.当在全局上下文或普通函数调用中,this
会默认指向全局对象(严格模式下为undefined)。
2.当函数作为某个对象的方法被调用时,this
会指向这个对象。
3.当使用new
关键字调用构造函数时,this
会指向构造函数创建的实例对象。
4..call()
,.apply()
,.bind()
方法可以设置this
的值,将this
指向()中的对象。
5.箭头函数中的没有自己的this
,此时会继承外层非箭头函数中的this
。
以上就是关于Js中this关键字的一些细节,希望对大家有帮助!!
转载自:https://juejin.cn/post/7379836868696735779