在javascript中,this關鍵字經(jīng)常被用到,它代表當前函數(shù)執(zhí)行的上下文,即執(zhí)行當前函數(shù)的對象。不同的上下文對應不同的this值,this值在函數(shù)執(zhí)行時才確定。
在全局作用域中,this指向window對象:
console.log(this); // Window
在函數(shù)中,方法調用決定了this的值,如果是通過對象來調用函數(shù),那么this就指向這個對象:
var obj = { name: "Tom", sayHello: function() { console.log(this.name); // Tom } }; obj.sayHello();
如果是通過函數(shù)名調用函數(shù),這個函數(shù)是在全局作用域中調用的,this會指向window對象:
var name = "Jack"; function sayName() { console.log(this.name); // Jack } sayName();
用call()或apply()方法調用函數(shù)時,可以指定函數(shù)執(zhí)行時的上下文,即指定this的值:
var obj1 = { name: "Mike" }; var obj2 = { name: "John" }; function sayName() { console.log(this.name); } sayName.call(obj1); // Mike sayName.apply(obj2); // John
構造函數(shù)中的this指向新創(chuàng)建的對象:
function Person(name) { this.name = name; this.sayHello = function() { console.log("Hello " + this.name); } } var p1 = new Person("Tom"); p1.sayHello(); // Hello Tom
在箭頭函數(shù)中,this指的是函數(shù)定義時所在的上下文,而不是調用時所在的上下文,箭頭函數(shù)不能通過call()或apply()方法改變this的值:
var obj = { name: "Tom", sayHello: function() { setTimeout(() => { console.log(this.name); // Tom }, 1000); } }; obj.sayHello();
在javascript中,this的值經(jīng)常會變化,需要根據(jù)具體情況來確定當前函數(shù)執(zhí)行的上下文,進而確定this的值。