this指向规则
- 当函数作为构造函数调用时,构造函数内部的this指向新创建的对象
- 直接通过函数名调用函数时,this指向的是全局对象window
- 将函数作为对象的方法调用时,this将指向该对象
//构造函数内部的this指向新创建的实例对象
function Student(name,age) {
this.name = name;
this.age = age;
this.introduce = function() {
console.log('大家好,我叫'+this.name +',今年'+this.age+'岁');
}
}
let stu = new Student('张三',12);
console.log(stu.introduce());//输出大家好,我叫张三,今年12岁
<script>
function foo() {
return this;
}
var o = {name:'jim',func:foo};
// 直接通过函数名调用函数
console.log(foo() === window);//输出true
// 函数作为对象的方法调用
console.log(o.func() === o); //输出true
</script>
更改this指向
-
在javascript中可以通过call()、apply(),bind()更改this指向;
-
call()apply()bind()第一个参数均表示将要将this指向更改的那个对象,apply()方法的第二个参数表示将要传给函数的参数,且以数组的形式传递;call()、bind()的第2~N个表示将要给函数传递的参数,用逗号分隔;
//更改this指向
var name = "张三";
function method(a,b) {
console.log(this.name + a + b);
}
method.apply({name:"李四"},[1,2]);//输出 李四12
method.call({name:"王五"},1,2);//输出 王五12
method.bind({name:"蜘蛛侠"},8,0);//无输出
var test = method.bind({name:"蜘蛛侠"},8,0);
method(1,2);//输出 张三12
test();//输出 蜘蛛侠80
- 值得注意的是虽然这三个方法都是用来更改this指向的,但apply()和call()方法会更改this指向并调用该构造函数,而bind()方法只更改this指向并不会调用该构造函数。