This的指向總的來說分為四點: 1.作為對象的方法調用。 2.作為普通函數調用。 或者 3.構造器調用。 4.Function.prototype.call或Function.prototype.apply調用 除此之外:this指向在運行中決定,不在代碼中決定 this在全局指向window對象 ...
This的指向總的來說分為四點:
1.作為對象的方法調用。
//1.作為對象的方法調用 var obj={ a:1, getA:function(){ alert(this===obj);//輸出:ture alert(this.a);//輸出:1 } };//即當函數作為對象的方法被調用時,this指向該對象 obj.getA();
2.作為普通函數調用。
//2.作為普通函數調用 window.name1="globalName1"; var getName1=function(){ return this.name1; }; console.log(getName1());//輸出:globalName
或者
//或者這樣 window.name2 = 'globalName2'; var myObject = { name: 'sven', getName2: function(){ return this.name2; } };//當函數不作為對象的調用時,也就是我們常說的普通函數方式,此時的this總是指全局對象,在瀏覽器的JavaScript里,這個全局對象時window對象。 var getName2= myObject.getName2; console.log( getName2() );//輸出globalName
3.構造器調用。
//3.構造器調用 var MyClass = function(){ this.name = 'sven'; }; var obj = new MyClass(); alert ( obj.name ); //輸出:sven //當使用new調用函數,該函數會返回一個對象,構造器里的this指向返回的對象,如上。
但用new構造器時要註意,要是構造器顯式的返回一個object類型的對象,那麼此次最終會返回那個顯式的對象
var MyClass = function(){ this.name = 'sven'; return { //顯式的返回一個對象 name: 'anne' } }; var obj = new MyClass(); alert ( obj.name ); //輸出:anne //但用new構造器時要註意,要是構造器顯式的返回一個object類型的對象,那麼此次最終會返回那個顯式的對象,如上。
不過當構造器不顯式的返回任何數據,或者返回的是非object類型,則不會造成上述問題
var MyClass = function(){ this.name = 'sven'; return 'anne'; //返回字元串string類型 }; var obj = new MyClass(); alert ( obj.name ); // 輸出:sven //不過當構造器不顯式的返回任何數據,或者返回的是非object類型,則不會造成上述問題,如上。
4.Function.prototype.call或Function.prototype.apply調用
var obj1 = { name: 'sven', getName: function(){ return this.name; } }; var obj2 = { name: 'anne' }; console.log( obj1.getName() ); //輸出: sven console.log( obj1.getName.call( obj2 ) ); //輸出:anne //跟普通函數相比,Function.prototype.call或Function.prototype.apply能動態改變傳入函數的this,如上。
除此之外:this指向在運行中決定,不在代碼中決定
this在全局指向window對象
this放在函數內,在運行時,函數是誰調用的,this就指向誰
函數的兩種調用方式:1.點式調用時,點前面是誰就調用誰指向誰如xx.f()。2.window.f()等價於f(),this指向window
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <div id="div1">我是一個div</div> </body> <script> window.id = 'window'; document.getElementById( 'div1' ).onclick = function(){ alert ( this.id ); //輸出:div1 var callback = function(){ alert ( this.id ); //輸出:window。但其實有時我們希望他指向該div節點 };//其實當在ECMAScript5的strict模式下,上面這種情況下的this已經被規定為不會指向全局對象,而是undefined。 callback(); }; //鑒於此,我們可以可以用一個變數保存div節點的引用,如下。 window.id = 'window'; document.getElementById( 'div1' ).onclick = function(){ var that = this; //保存div的引用 var callback = function(){ alert ( that.id ); //輸出:div1 }; callback(); }; //其實當在ECMAScript5的strict模式下,上面這種情況下的this已經被規定為不會指向全局對象,而是undefined,如下。 function func(){ "use strict"; alert ( this ); //輸出:undefined } func(); </script> </html>