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的指向问题

有五点:

  1. 自执行函数
    自执行函数的this永远是window。
  2. 有点没点
    看函数执行的时候前面有没有点,有点,点前面是啥this就是啥,没点就是window。
  3. 事件
    给元素的某一个事件类型绑定一个方法(如button.onclick = fn()),当事件触发执行方法,方法中的this就是当前元素(button).
  4. 构造函数模式创建类
    在构造函数模式创建类的时候,方法执行,里面的this就是当前类的一个实例。
  5. 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问题:

  1. 先把this是谁搞定(遵循上面的5条准则),然后把this改为对应代码。
  2. 其他都不用管,直接按原型查找机制(先找私有的,没找到再找公有的),计算结果。
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值