1、this指向谁
Java中this指向的是当前类的实例对象,JavaScript中this指向的是函数的调用者。不同于Java,JavaScript中函数可以直接执行,函数可以作为对象的方法(通过对象调用方法)执行,函数可以作为构造函数创建对象。
2、普通函数调用
<script>
function Student(name) {
this.name = name;
console.log(this, this.name);
}
Student("star");//window star
console.log(window.name);//star
</script>
直接调用函数时,this指向了window对象,函数是由浏览器窗口执行的,所以name属性被添加到了window对象上,此时this和window是等价的。
3、对象调用方法
<script>
// 堆代码 duidaima.com
var name = "moon";
var obj = {
name: "star",
hello: function () {
var hi = function () {
console.log(this, this.name);
}
hi();//window moon
return this.name;
}
}
console.log(obj.hello());//star
</script>
由于hello方法的调用者是obj,所以在hello中返回this.name可以获取到对象obj的name属性值,在hello方法中this和obj是等价的。hi函数虽然在hello方法内部,但是没有调用者,所以this是window对象。
4、构造函数
<script>
function Student(name) {
this.name = name;
console.log(this, this.name);
}
var star = new Student("star");//Student {name: 'star'} star
console.log(star.name);
var moon = new Student("moon");//Student {name: 'moon'} moon
console.log(moon.name);
</script>
使用构造函数的形式类似Java创建对象,this就是刚创建出来的对象。
5、使用call & apply改变this指向
<script>
var name = "star";
var obj = {
name: "moon"
}
var show = function show() {
console.log(this,
this.name,
`age:${arguments[0]}, salary:${arguments[1]}`);
}
show();
show.call(obj, 25);
show.apply(obj, [25, 3000]);
</script>
通过call和apply可以改变当前的this指向,直接执行show函数时this指向的是window对象,call和apply调用时this指向了第一个参数,类似Java的反射方法调用(method.invoke(obj,params))。