s中的this總是讓人,是js眾所周知的坑之一。 總結一下,this的坑分為5種。 1.全局代碼中的this。 alert(this);//window 全局範圍內this將會全局,在瀏覽器window 2.作為單純函數調用 這裡this指向全局對象,就是window。在嚴格模式中,則undefie ...
s中的this總是讓人,是js眾所周知的坑之一。
總結一下,this的坑分為5種。
1.全局代碼中的this。
alert(this);//window
全局範圍內this將會全局,在瀏覽器window
2.作為單純函數調用
function foo(x){ this.x = x; } foo(99); alert(x);//全局變數x值為99
這裡this指向全局對象,就是window。在嚴格模式中,則undefiend。
3.作為對象的方法調用
var name = "xiaoming"; var person = { name:"xiaohong", hello:function(sth){ console.log(this.name + "says" + sth); } } person.hello("hello world");
輸出 xiaohong says hello world。this指向person對象,即當前對象。
4.作為構造函數
new Foo();
function Foo(){
this.name = “fooname”;
}
構造函數內部的this指向新創建的對象
5.內部函數
var name = "xiaoming"; var person = { name:"xiaohong", hello:function(sth){ var sayhello = function(sth){ console.log(this.name + "says" + sth); } sayhello(sth); } } person.hello("hello world");
在內部函數中,this沒有按預想的綁定到外層函數對象上,而是綁定到了全局對象。這裡普 遍被認為是 JavaScript語言的設計錯誤,因為沒有人想讓內部函數中的 this指向全局對象。 一般的處理方式是將 this作為變數保存下來,一般約定為 that或者 self
var name = "xiaoming"; var person = { name:"xiaohong", hello:function(sth){ var that = this; var sayhello = function(sth){ console.log(that.name + "says" + sth); } sayhello(sth); } } person.hello("hello world");
6.使用call和apply設置this
person.hello.call(person, “world”);
apply和 call類似,只是後面的參數是通過一個數組傳入,而不是分開傳入。兩者的方法定義:
call(thisArg[,arg1,arg2,…]); // 參數列表,arg1,arg2,…
apply(thisArg [,argArray] ); // 參數數組,argArray
兩者都是將某個函數綁定到某個具體對象上使用,自然此時的 this會被顯式的設置為第一 個參數。
我們可能經常會寫這樣的代碼:
$(“#ele”).click=obj.handler;
如果在 handler中用了 this,this會綁定在 obj上麽?顯然不是,賦值以後,函數是在回調中執行的,this會綁定到$(“#ele”)元素上。
這邊介紹一個bind方法
var name = "xiaoming"; var person = { name:"xiaohong", hello:function(sth){ var that = this; var sayhello = function(sth){ console.log(that.name + "says" + sth); } sayhello(sth); } } var odiv = document.getElementById("odiv"); odiv.onclick=person.hello.bind(person,"hello world");//xiaohong says hello world
bind方法和call/apply方法一樣,不同的就是bind方法不執行,只是拷貝代碼。用這個方法可以改變this指向,this指向的不再是odiv而是person。
web前端/H5/javascript學習群:250777811 歡迎大家關註我的微信號公眾號,公眾號名稱:web前端EDU。掃下麵的二維碼或者收藏下麵的二維碼關註吧(長按下麵的二維碼圖片、並選擇識別圖中的二維碼)