this

另外,可以看看这篇文章:https://www.cnblogs.com/pengshengguang/p/11105323.html

this对象是在运行时基于函数的执行环境绑定的:

  • 在全局函数中,this—>window

  • 在函数中

    1、作为对象的方法来调用 this—>当前的对象

    2、作为普通的函数调用 this—>window

    (1.2可总结为 看函数名前面是否有“.” ,有的话, “.”前面是谁,this就是谁;没有的话this就是window )

    3、作为构造函数和new使用 this—>构造函数内部新创建的对象

    4、被call或者是apply调用(函数上下文调用) this—>第一个参数

    5、立即执行函数中的this永远都是window

    6、箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值。通过 call() 或 apply() 方法调用一个函数时,只传入了一个参数,对 this 并没有影响

    (function() {
      return [
        (() => this.x).bind({ x: 'inner' })()
      ];
    })()
    // undefined
    (function() {
      return [
        (() => this.x).bind({ x: 'inner' })()
      ];
    }).call({ x: 'outer' });
    // ['outer']
    

一道this面试题

var num = 20;
var obj = {
    num: 30,
    fn: (function(num) {
        this.num *= 3;
        num += 15;
        var num = 45;
        return function() {
            this.num *= 4;
            num += 20;
            console.log(num);
        }
    })(num)
};
var fn = obj.fn;
fn(); // ->65
obj.fn(); // ->85
console.log(window.num, obj.num) // ->240, 120

// 1、fn();
// 因为立即执行函数中的this永远是window,所以 this.num = 20*3 = 60, num到上一个作用域找到是45
// 输出num 45+20=65   window.num = 60*40 = 240   obj.num = 30

// 2、obj.fn(); 
// this指向obj,所以这里面 this.num = 30,num = 65
// 输出num 65+20=85   window.num = 240           obj.num = 30*4 = 120
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章