js中的this


如何区别JavaScript中的this指向

类型一:在函数中直接调用的

  • 直接调用的函数this指向window
function greet(text) {
    console.log(text);
}
greet("Hello"); // hello
greet.call(window, "Hello"); // hello

类型二:函数作为对象的方法被调用的

  • 谁调用函数,函数的this就指向谁
let person = {
    name: "张三",
    sayHello: function(text) {
        console.log(`${this.name}笑着向你说:${text}`);
    }
}
person.sayHello("Hello"); // 张三笑着向你说:Hello
person.sayHello.call(person, "Hello"); // 张三笑着向你说:Hello

一道面试题

  • 打印结果是什么?
var name = 222;
var a = {
    name: 111,
    say: function() {
        console.log(this.name);
    }
}

var fun = a.say;
fun();
a.say();

var b = {
    name: 333,
    say: function(fn){
        fn();
    }
}

b.say(a.say);
b.say = a.say;
b.say();
  • 打印结果
// 不要使用let
var name = 222;
var a = {
    name: 111,
    say: function() {
        console.log(this.name);
    }
}

var fun = a.say;
fun(); // 222  -> fun.call(window)
a.say(); // 111 a.say.call(a)

var b = {
    name: 333,
    say: function(fn){
        fn();
    }
}

b.say(a.say); // 222  -> fn.call(window)    此处传参a.say给fn()并执行,等价于  (a.say)()  也就是fn.call(window)
b.say = a.say;
b.say(); // 333  -> b.say.call(b)

箭头函数中的this

  • 箭头函数内部没有绑定this机制,即箭头函数没有this,导致箭头函数的this指向外层代码块的this
var x = 11;
var obj = {
    x: 22,
    say: () => {
        console.log(this.x);
    }
}
obj.say(); // 11    -> this指向外层的window
var x = 11;
var obj = {
    x: 22,
    say: function(){
        var x = 33;
        var fn = () => {
            console.log(this.x)
        }
        return fn();
    }
}
obj.say(); // 22    -> this指向外层的obj

  目录