改變javascript函數(shù)內(nèi)部this指針指向的三種方法
更新時(shí)間:2010年04月23日 19:06:55 作者:
javascript 的this 值,真的是非常的莫名奇妙。我一直被搞的很頭暈,也許正是這個(gè)this,讓大多數(shù)人感覺(jué)js 非常的莫名其妙。
在查了大量的資料后,我總結(jié)了下面的三條規(guī)則,這三條規(guī)則,已經(jīng)可以解決目前我所遇到的所有問(wèn)題.
規(guī)則0:函數(shù)本身是一個(gè)特殊類型,大多數(shù)時(shí)候,可以認(rèn)為是一個(gè)變量。
function a()
{
alert(this);
}
或者
var a = function()
{
alert(this);
}
都可以認(rèn)為是創(chuàng)建了一個(gè)變量,這個(gè)變量的值就是一個(gè)函數(shù)。
規(guī)則1:如果一個(gè)函數(shù),是某個(gè)對(duì)象的key 值,那么,this就指向這個(gè)對(duì)象。
這個(gè)規(guī)則很好理解:
var a = function(obj)
{
alert(this == obj);
}
var o = {};
o.afun = a;
o.afun(o); //true
函數(shù)就是一個(gè)變量,但是可以綁定到某個(gè)對(duì)象的下面,并且 this 就會(huì)指向 o 對(duì)象。
這里必須要注意,沒(méi)有被綁定的對(duì)象,默認(rèn)this 指向window 對(duì)象。
舉幾個(gè)例子:
function a()
{
//this == window
}
function a()
{
//this == window
function b()
{
//this == window
}
}
還必須注意的是,綁定沒(méi)有傳遞性,比如上面的嵌套的函數(shù),a綁定到 o 對(duì)象,那么就影響了a函數(shù),
而b 還是指向到window。
規(guī)則2:如果函數(shù)new 了一下,那么就會(huì)創(chuàng)建一個(gè)對(duì)象,并且this 指向 新創(chuàng)建的對(duì)象。
var o = new a();
這個(gè)時(shí)候,o 不再是個(gè)函數(shù),而實(shí)際上,可以認(rèn)為是這樣的一個(gè)過(guò)程。
創(chuàng)建一個(gè)對(duì)象 var o = {};
然后,把this 指向 o,通過(guò)this 把 o 給初始化了。
規(guī)則3:通過(guò)apply 可以改變this 的指向
這個(gè)apply 的綁定就更加的靈活了,實(shí)際上,apply的功能和下面的功能差不多。
var a = function (obj)
{
alert(this == obj);
};
obj.fun = a;
obj.fun(obj);//true
簡(jiǎn)單的,可以a.apply(obj, [obj]); // true
javascript 的this 可以簡(jiǎn)單的認(rèn)為是 后期綁定,沒(méi)有地方綁定的時(shí)候,默認(rèn)綁定window。
綜合實(shí)例:
jquery 里面有一個(gè)很常用的函數(shù) each,可以把循環(huán)的對(duì)象元素綁定到this,方便操作。
這里只是簡(jiǎn)單的做個(gè)演示:
代碼
function each(tagName, callback)
{
var lists = document.getElementsByTagName(tagName);
for (var i = 0; i < lists.length; i++)
{
callback.apply(lists[i]);
}
}
each("a",
function ()
{
this.style.color = "red";
}
);
可以看到我頭部導(dǎo)航的鏈接都變成紅色了。
規(guī)則0:函數(shù)本身是一個(gè)特殊類型,大多數(shù)時(shí)候,可以認(rèn)為是一個(gè)變量。
復(fù)制代碼 代碼如下:
function a()
{
alert(this);
}
或者
var a = function()
{
alert(this);
}
都可以認(rèn)為是創(chuàng)建了一個(gè)變量,這個(gè)變量的值就是一個(gè)函數(shù)。
規(guī)則1:如果一個(gè)函數(shù),是某個(gè)對(duì)象的key 值,那么,this就指向這個(gè)對(duì)象。
這個(gè)規(guī)則很好理解:
復(fù)制代碼 代碼如下:
var a = function(obj)
{
alert(this == obj);
}
var o = {};
o.afun = a;
o.afun(o); //true
函數(shù)就是一個(gè)變量,但是可以綁定到某個(gè)對(duì)象的下面,并且 this 就會(huì)指向 o 對(duì)象。
這里必須要注意,沒(méi)有被綁定的對(duì)象,默認(rèn)this 指向window 對(duì)象。
舉幾個(gè)例子:
復(fù)制代碼 代碼如下:
function a()
{
//this == window
}
function a()
{
//this == window
function b()
{
//this == window
}
}
還必須注意的是,綁定沒(méi)有傳遞性,比如上面的嵌套的函數(shù),a綁定到 o 對(duì)象,那么就影響了a函數(shù),
而b 還是指向到window。
規(guī)則2:如果函數(shù)new 了一下,那么就會(huì)創(chuàng)建一個(gè)對(duì)象,并且this 指向 新創(chuàng)建的對(duì)象。
var o = new a();
這個(gè)時(shí)候,o 不再是個(gè)函數(shù),而實(shí)際上,可以認(rèn)為是這樣的一個(gè)過(guò)程。
創(chuàng)建一個(gè)對(duì)象 var o = {};
然后,把this 指向 o,通過(guò)this 把 o 給初始化了。
規(guī)則3:通過(guò)apply 可以改變this 的指向
這個(gè)apply 的綁定就更加的靈活了,實(shí)際上,apply的功能和下面的功能差不多。
復(fù)制代碼 代碼如下:
var a = function (obj)
{
alert(this == obj);
};
obj.fun = a;
obj.fun(obj);//true
簡(jiǎn)單的,可以a.apply(obj, [obj]); // true
javascript 的this 可以簡(jiǎn)單的認(rèn)為是 后期綁定,沒(méi)有地方綁定的時(shí)候,默認(rèn)綁定window。
綜合實(shí)例:
jquery 里面有一個(gè)很常用的函數(shù) each,可以把循環(huán)的對(duì)象元素綁定到this,方便操作。
這里只是簡(jiǎn)單的做個(gè)演示:
代碼
復(fù)制代碼 代碼如下:
function each(tagName, callback)
{
var lists = document.getElementsByTagName(tagName);
for (var i = 0; i < lists.length; i++)
{
callback.apply(lists[i]);
}
}
each("a",
function ()
{
this.style.color = "red";
}
);
可以看到我頭部導(dǎo)航的鏈接都變成紅色了。
相關(guān)文章
javascript 面向?qū)ο?實(shí)現(xiàn)namespace,class,繼承,重載
這幾天老大天天嚷嚷要重構(gòu)我們寫的javascript,抱怨代碼太混亂,可讀性差,維護(hù)困難,要求javascript也按面對(duì)象的模型來(lái)重構(gòu)。2009-10-10JavaScript 對(duì)象鏈?zhǔn)讲僮鳒y(cè)試代碼
自從使用了jQuery以后,對(duì)它的鏈?zhǔn)讲僮骱苁且蕾?,以至于常常覺(jué)得其他庫(kù)不好用。。2010-04-04一實(shí)用的實(shí)現(xiàn)table排序的Javascript類庫(kù)
一實(shí)用的實(shí)現(xiàn)table排序的Javascript類庫(kù)...2007-09-09