由于其運行期綁定的特性,JavaScript 中的 this 含義要豐富得多,它可以是全局對象、當前對象或者任意對象,這完全取決于函數(shù)的調(diào)用方式。
JavaScript 中函數(shù)的調(diào)用有以下幾種方式:作為函數(shù)調(diào)用,作為對象方法調(diào)用,作為構(gòu)造函數(shù)調(diào)用,和使用 apply 或 call 調(diào)用。下面我們將按照調(diào)用方式的不同,分別討論 this 的含義。
情況一:純粹的函數(shù)調(diào)用
這是函數(shù)的最通常用法,屬于全局性調(diào)用,因此this就代表全局對象Global。
1、函數(shù)也可以直接被調(diào)用,此時 this 綁定到全局對象。
function makeNoSense(x) {
this.x = x;
}
makeNoSense(5);
console.log(x);// x 已經(jīng)成為一個值為 5 的全局變量
function test(){
this.x = 1;
alert(this.x);
}
test(); // 1
情況二:作為對象方法的調(diào)用
函數(shù)還可以作為某個對象的方法調(diào)用,這時this指代對象內(nèi)部屬性被調(diào)用。
var myObject = {
value :0,
increment:function (inc){
this.value += typeof inc ==='number' ? inc:1;
}
};
myObject.increment();
console.log(myObject.value); //1
myObject.increment(2);
console.log(myObject.value); //3
情況三 :作為構(gòu)造函數(shù)調(diào)用
javaScript 支持面向?qū)ο笫骄幊?,與主流的面向?qū)ο笫骄幊陶Z言不同,JavaScript 并沒有類(class)的概念,而是使用基于原型(prototype)的繼承方式。
相應的,JavaScript 中的構(gòu)造函數(shù)也很特殊,如果不使用 new 調(diào)用,則和普通函數(shù)一樣。作為又一項約定俗成的準則,構(gòu)造函數(shù)以大寫字母開頭,提醒調(diào)用者使用正確的方式調(diào)用。如果調(diào)用正確,this 綁定到新創(chuàng)建的對象上。
所謂構(gòu)造函數(shù),就是通過這個函數(shù)生成一個新對象(object)。這時,this就指這個新對象。
function Point(x, y){
this.x = x;
this.y = y;
}
var p1 = new Point(3,2);
console.log(p1.x+","+p1.y);//3,2
為了表明這時this不是全局對象,我對代碼做一些改變:
var x = 4;
function Point(x, y){
this.x = x;
this.y = y;
}
var p1 = new Point(3,2);
console.log(p1.x+","+p1.y);//3,2
情況四: apply或call調(diào)用
讓我們再一次重申,在 JavaScript 中函數(shù)也是對象,對象則有方法,apply 和 call 就是函數(shù)對象的方法。這兩個方法異常強大,他們允許切換函數(shù)執(zhí)行的上下文環(huán)境(context),即 this 綁定的對象。很多 JavaScript 中的技巧以及類庫都用到了該方法。讓我們看一個具體的例子:
function Point(x, y){
this.x = x;
this.y = y;
this.moveTo = function(x, y){
this.x = x;
this.y = y;
console.log(this.x+","+this.y);
}
}
var p1 = new Point(0, 0);
var p2 = {x: 0, y: 0};
p1.moveTo(1, 1); //1,1
p1.moveTo.apply(p2, [10, 10]);//10,10
在上面的例子中,我們使用構(gòu)造函數(shù)生成了一個對象 p1,該對象同時具有 moveTo 方法;使用對象字面量創(chuàng)建了另一個對象 p2,我們看到使用 apply 可以將 p1 的方法應用到 p2 上,這時候 this 也被綁定到對象 p2 上。另一個方法 call 也具備同樣功能,不同的是最后的參數(shù)不是作為一個數(shù)組統(tǒng)一傳入,而是分開傳入的。本文通過對JavaScript中經(jīng)常容易混淆的this在四中應用場景中的使用方法進行了講解,希望對您有所幫助,喜歡的話,請推薦一下哦。