在JavaScript中,關(guān)鍵字this非常重要,它用于指代當(dāng)前對象或者當(dāng)前執(zhí)行上下文。this的指向是動態(tài)、隨著上下文的改變而改變的。
舉個(gè)例子:
var name = "Tom"; var person = { name: "John", sayName: function() { console.log(this.name); } } person.sayName(); // "John"
在上面的代碼中,this指代的是person對象,因?yàn)樵摵瘮?shù)是在person對象上調(diào)用的。如果sayName()函數(shù)是直接在全局作用域下調(diào)用的,那么this指代的就是window對象。
在使用ES6的類聲明中,this也可以用于指代類的實(shí)例對象:
class Person { constructor(name, age) { this.name = name; this.age = age; } sayName() { console.log(this.name); } } var person = new Person("Tom", 18); person.sayName(); // "Tom"
在上面的代碼中,this指代的就是person實(shí)例對象。
除了以上的例子,this還可以用于指代構(gòu)造函數(shù)中的實(shí)例對象:
function Person(name, age) { this.name = name; this.age = age; this.sayName = function() { console.log(this.name); } } var person = new Person("Tom", 18); person.sayName(); // "Tom"
在上面的代碼中,this指代的就是構(gòu)造函數(shù)Person的實(shí)例對象。
雖然this的行為非常靈活,但有時(shí)候也會帶來一些問題。比如在嵌套函數(shù)中使用this時(shí),可能會造成指向錯(cuò)誤:
var person = { name: "Tom", friends: ["John", "Bob"], sayFriends: function() { this.friends.forEach(function(friend) { console.log(this.name + "的朋友是" + friend); }); } } person.sayFriends(); // "undefined的朋友是John","undefined的朋友是Bob"
在上面的代碼中,forEach中的函數(shù)中的this指向的是window對象。為了避免這個(gè)問題,可以使用箭頭函數(shù)替代:
var person = { name: "Tom", friends: ["John", "Bob"], sayFriends: function() { this.friends.forEach((friend) =>{ console.log(this.name + "的朋友是" + friend); }); } } person.sayFriends(); // "Tom的朋友是John","Tom的朋友是Bob"
這樣,箭頭函數(shù)的this就指向了外層函數(shù)的this。
總之,this是JavaScript中一個(gè)十分重要的關(guān)鍵字,必須牢牢掌握它的使用方法和指向規(guī)律,才能夠更好地編寫JavaScript程序。
上一篇php j=教程
下一篇python畫樹冠樹干