this是什么?
我尝试给this下一个定义吧:this是一个函数(方法)在运行时,内部自动生成的一个对象。它指向了函数(方法)的拥有者。
我觉得这样便于理解,因为关于this最重要的以下几点都能被概括:
- this只存在于函数里面,而且this的取值只有在函数运行,也就是被调用的时候才能确定;
- this的意思其实就是,正在运行的这个函数,或者说方法,属于谁。
不要怪我混淆函数和方法,在javascript里,可以说万物皆是对象,函数无论声明或运行在哪里,它都可以被当成某个对象的方法。
那既然this只有在调用时才能确定,其实它也就很好总结了,因为js中函数的调用只有五种情况。
1.构造函数
如果函数作为构造函数用,那么其中的this就代表它即将new出来的对象;
那如果不把它当作构造对象呢?当然它就成了一个普通的定义在全局环境里的函数了,可以将它看作是window对象的方法,所以this指向window。
function show(val) {
this.value = val;
};
show.prototype.getVal = function() {
alert(this.value);
};
var func = new show(1);
func.getVal(); // 输出1
alert(func.value) // 输出1
// 从上面的结果, 可以看出, 此时的this指向了func对象.
2.对象的方法
这个不必多说,如果函数作为对象的一个属性时,并且作为对象的一个属性被调用时,函数中的this指向该对象。
var obj = {
value: 1,
getValue: function() {
alert(this.value);
}
};
obj.getValue(); // 输出1, 此时的this指向obj
3.全局/普通调用函数
当然指向window,在全局环境下this永远是window
console.log(this) === window //true
4.函数用call或apply调用
apply和call方法可以让我们设定调用者中的this指向谁, 如:
ar fun = function(str) {
this.status = str;
}
fun.prototype.getStatus = function() {
alert(this.status);
}
var obj = {
status: "loading"
};
fun.prototype.getStatus.apply(obj); // 输出"loading", 此时getStatus方法中的this指向了obj
5.匿名函数和定义在函数内部的函数
这种情况下this一般指向window。
var obj = {
x:10,
fn:function(){
function f(){
console.log(this) //window
console.log(this.x) //undefined
}
f()
}
}
obj.fn()
一句话总结this:当前的方法属于谁。
网友评论