JS中this的指向问题
this的定义
this指的是当前函数执行的主体,也就是说,谁执行这个函数,this就是谁。
注意点
函数外面的this是window,但我们研究的是函数内部的this问题,因为这个比较具有困惑性。
一定要注意一点:this是谁,和函数在哪个作用域定义的以及在哪执行的没有任何关系
。
function fn() {
function B() {
console.log(this); //=>Window
}
B();
}
fn();
var obj = {
name: 'obj',
fn: function () {
console.log(this);
}
};
obj.fn(); // => this: obj
var f = obj.fn;
f(); // => this: Window
我们只依据下面总结的五点来判断this的指向问题。
非严格模式下this的指向问题
有五点:
自执行函数
自执行函数的this永远是window。有点没点
看函数执行的时候前面有没有点,有点,点前面是啥this就是啥,没点就是window。事件
给元素的某一个事件类型绑定一个方法(如button.onclick = fn()),当事件触发执行方法,方法中的this就是当前元素(button).构造函数模式创建类
在构造函数模式创建类的时候,方法执行,里面的this就是当前类的一个实例。call和apply
使用call和apply可以任意修改this的指向。
严格模式下this的指向问题
严格模式:在代码开头加上
"use strict";
在严格模式下,若函数的执行主体不明确,this指向undefined
(非严格模式指向window)。
"use strict";
var obj = {
name: 'obj',
fn: function () {
console.log(this);
}
};
obj.fn(); // => this: obj
var f = obj.fn;
f(); // => this: undefined
"use strict";
console.log(this); // Window
原型中的this
查找公有方法(即定义在原型prototype
中的方法)中的this
问题:
- 先把this是谁搞定(遵循上面的5条准则),然后把this改为对应代码。
- 其他都不用管,直接按原型查找机制(先找私有的,没找到再找公有的),计算结果。
function Fn() {
this.x = 100;
}
Fn.prototype.x = 200;
Fn.prototype.getX = function () {
console.log(this.x);
}
var f = new Fn;
f.getX(); //=>100
f.__proto__.getX(); //=>200