什么是this?
this是JavaScript中的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。this实际是在函数被调用时才发生的绑定,也就是说this具体指向什么,取决于你是怎么调用的函数。
this的四种模式
1.默认绑定
这是函数最通常的用法,func()是直接调用的(独立函数调用),没有应用其他的绑定规则,这里进行了默认绑定,将全局对象绑定this上,因此this就代表全局对象Global
代码语言:javascript复制var name = '贝吉塔'
var func = function {
console.log(this.name)
}
func() //贝吉塔
注意:在严格模式下,全局对象将无法使用默认绑定,即执行会报undefined的错误
代码语言:javascript复制var name = '贝吉塔'
var func = function {
"use strict"; //开启严格模式
console.log(this.name)
}
func() //undefined
2.隐式绑定
作为对象的方法调用,该对象即为调用上下文,this指向该对象
代码语言:javascript复制var name = '贝吉塔'
var func = function {
console.log(this.name)
}
var obj = {
name:'卡卡罗特',
func: func,
anotherObj: {
name: '魔人布欧',
func: func
}
}
obj.func() //卡卡罗特
obj.anotherObj.func() //魔人布欧
3.new绑定
作为构造函数调用,构造函数试图初始化这个新创建的对象,并将这个对象作为其调用上下文,this 指向这个新创建的对象
代码语言:javascript复制var name = '贝吉塔'
function Func() {
this.name = '卡卡罗特'
console.log(this.q)
}
var obj = new Func //卡卡罗特
console.log(this.q) //贝吉塔
4.显式绑定
通过函数的call/apply方法间接调用, call/apply方法的第一个参数是调用上下文,在函数体内,通过this获得对它的引用
代码语言:javascript复制var name = '贝吉塔'
function func() {
console.log(this.name)
}
var obj = {
name:'卡卡罗特'
}
func.apply() //贝吉塔
func.call() //贝吉塔
func.apply(obj) //卡卡罗特
func.call(obj) //卡卡罗特
优先级
new绑定>显式绑定>隐式绑定>默认绑定
箭头函数(ES6语法)
ES6中的箭头函数。通过“=>”而不是function创建的函数,叫做箭头函数。它的this绑定取决于外层(函数或全局)作用域。
代码语言:javascript复制//普通函数
function foo(){
console.log( this.name );
}
var name = '贝吉塔';
var obj = {
name: '卡卡罗特',
foo: foo
};
obj.foo(); // 卡卡罗特
代码语言:javascript复制//箭头函数
var foo = () => {
console.log( this.name );
}
var name = '贝吉塔';
var obj = {
name: '卡卡罗特',
foo: foo
};
obj.foo(); //贝吉塔
foo.call(obj); //贝吉塔 ,箭头函数中显示绑定不会生效
本人水平十分有限,内容若有错误,欢迎指正!
本文借鉴了很多前辈博客的思路,非常感谢大佬们的无私共享!
我的博客即将同步至腾讯云 社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=k17x90c6gt1o