this想必大家都很不陌生了,在例如Vue.js
中,各种this,唰唰唰的写,但是有没有遇到this指向出错的问题呢?
我有,我猜应该也会有人跟我一样。
所以,我总结了一些this的基础概念和基本使用在这里,供大家参考。
全局上下文中的this
console.log(this)来打印出来全局执行上下文中的 this,最终输出的是 window 对象。
所以可以得出这样一个结论:全局执行上下文中的 this 是指向 window 对象的。这也是 this 和作用域链的唯一交点,作用域链的最底端包含了 window 对象,全局执行上下文中的 this 也是指向 window 对象
函数上下文中的this
在全局环境中调用一个函数,函数内部的 this 指向的是全局变量 window。
通过一个对象来调用其内部的一个方法,该方法的执行上下文中的 this 指向对象本身
function foo(){
console.log(this)
};
foo(); // window
let a = {
b:0,
fn:function(){
console.log(this)
}
}
a.fn(); //{ b:0, fn:f() }
var myObj = {
name : "Ned",
showThis: function(){
console.log(this); // myObj
var bar = function(){
this.name = "阿泽";
console.log(this) // window
}
bar();
}
};
myObj.showThis();
console.log(myObj.name); // Ned
console.log(window.name); // 阿泽
解决this不继承的方法
var myObj = {
name : "Ned",
showThis:function(){
console.log(this); // myObj
var bar = ()=>{
this.name = "阿泽";
console.log(this) // window
}
bar();
}
};
myObj.showThis();
console.log(myObj.name); // 阿泽
console.log(window.name); //
var myObj = {
name : "Ned",
showThis:function(){
console.log(this); // myObj
var self = this;
var bar = function (){
self.name = "阿泽";
console.log(self) // window
}
bar();
}
};
myObj.showThis();
console.log(myObj.name); // 阿泽
console.log(window.name); //
都能够改变函数执行时的上下文,将一个对象的方法交给另一个对象来执行,并且是立即执行的
调用 call 和 apply 的对象,必须是一个函数 Function
Function.call(obj,param1,param2,...)
需要注意以下几点:
function func (a,b,c) {}
func.call(obj, 1,2,3)
// func 接收到的参数实际上是 1,2,3
func.call(obj, [1,2,3])
// func 接收到的参数实际上是 [1,2,3],undefined,undefined
// 其实func还是接收了三个参数,只不过咱们只传了一个过去,这个应该很容易理解的
Function.apply(obj[,argArray])
需要注意的是:
func.apply(obj, [1,2,3])
// func 接收到的参数实际上是 1,2,3
func.apply(obj, {
0: 1,
1: 2,
2: 3,
length: 3
})
// func 接收到的参数实际上是 1,2,3
下面会分别列举 call 和 apply 的一些使用场景。
声明:例子中没有哪个场景是必须用 call 或者必须用 apply 的,看个人习惯就好。
对象的继承如下面这个例子:
function superClass () {
this.a = 1;
this.print = function () {
console.log(this.a);
}
}
function subClass () {
superClass.call(this); // 执行superClass,并将superClass方法中的this指向subClass
this.print();
}
subClass();
// 1
subClass 通过 call 方法,继承了 superClass 的 print 方法和 a 变量。
此外,subClass 还可以扩展自己的其他方法。
在 MDN 上的解释是:bind() 方法创建一个新的函数,在调用时设置 this 关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。
它的语法如下:
Function.bind(thisArg[, arg1[, arg2[, ...]]])
bind 方法 与 apply 和 call 比较类似,也能改变函数体内的 this 指向。
不同的是,bind 方法的返回值是函数,并且需要稍后调用,才会执行。
而 apply 和 call 则是立即调用,来看下面这个例子:
function add (c) {
return this.a + this.b + c;
}
var obj = {a:1,b:2}
add.bind(obj, 5); // 这时,并不会返回 8
add.bind(sub, 5)(); // 调用后,返回 8
如果 bind 的第一个参数是 null 或者 undefined,this 就指向全局对象 window。
"abc"的使用,具体还是要看个人运用,理解了之后,那它们就变成了工具,怎么顺手怎么来了~
顺便说一下本人,我还是喜欢apply多一点hhh,用它的次数多一点,所以在场景用谁都行的时候,我一般都会选择apply。
阅读量:1160
点赞量:0
收藏量:0