亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(guān)于javascript中this關(guān)鍵字(翻譯+自我理解)

 更新時間:2010年10月20日 12:12:32   作者:  
在傳統(tǒng)面向?qū)ο笳Z言中,this關(guān)鍵字是個很乖的小孩,從不亂跑,該是誰的就是誰的??墒窃贘avaScript中,我們發(fā)現(xiàn)它不那么乖,有時甚至把我們搞的暈頭轉(zhuǎn)向的。所以有必要對它稍微做個總結(jié)。
下文有大概70%的內(nèi)容出自http://www.quirksmode.org/js/this.html,另外30%是我自己對它的理解和感想。希望能對有需要的人一點幫助。。。

首先,先看一個很典型的關(guān)于this關(guān)鍵字題目:
復(fù)制代碼 代碼如下:

var name = 'hong'
var obj = {
name: 'ru',
getName: function(){
return function(){
return this.name;
};
}
}
alert(obj.getName()());

這里也不賣關(guān)子了,執(zhí)行結(jié)果為:hong
稍微改下代碼:
復(fù)制代碼 代碼如下:

var name = 'hong'
var obj = {
name: 'ru',
getName: function(){
var that = this;
return function(){
return that.name;
};
}
}
alert(obj.getName()());

執(zhí)行結(jié)果為:ru
執(zhí)行結(jié)果為:ru

關(guān)于出現(xiàn)這種結(jié)果的原因,下面會細(xì)細(xì)討論。
【函數(shù)的擁有者】
要解釋this,要先說這個概念。在JavaScript里,this始終指向我們當(dāng)前正在執(zhí)行的函數(shù)的“擁有者”。更為確切的說:是指向把這個函數(shù)作為方法的對象。
這句話怎么理解,我們可以看看下面的例子:
復(fù)制代碼 代碼如下:

/* -- test1 -- */
function test1 () {
this.title = 'me';
alert(window['title']);
alert(this === window); //true
}
test1();


執(zhí)行結(jié)果為:me, true
在上例中,this是指向window對象的。并把window這個對象的title屬性寫為'me',因為test1是個頂級函數(shù),所以它的擁有者是window對象,或者說它是window對象的一個方法。這個應(yīng)該不難理解。比如上面調(diào)用test1()時,也可以寫成 window.test1();這樣的明了了。

  接下來,我們建一個div,并把test1作為方法賦給div的onclick屬性:
復(fù)制代碼 代碼如下:

<div id="o" style="width:50px;height:50px;border:4px solid #333">me!</div>
<script type="text/javascript">
/* -- test1 -- */
function test1 () {
this.title = 'me';
alert(window['title']);
alert(this === window);
}
var o = document.getElementById('o');
o.onclick = test1;
</script>

點擊div結(jié)果為:undefined, false; 同時我們用firebug可以看到‘me'這個屬性值其實是被賦給了id為‘o'的這個HtmlObject

顯而易見,此時this指向了這個div,也就是說,test1()的擁有者變成了div這個HtmlObject,或者說它變成了div的onclick方法來調(diào)用。這種情況應(yīng)該還是容易理解的。
下面我們接著改代碼,就改一個地方:
復(fù)制代碼 代碼如下:

o.onclick = test1(); // 注意:這里加了個括號

把上面代碼的最后一句改成這樣后,點擊div運(yùn)行的結(jié)果為:me, true
變成了和第一種情況一樣了,this指向了window。有人會納悶,覺得沒什么區(qū)別,其實是有區(qū)別的。這里涉及到函數(shù)的copy和refer的問題。

  【函數(shù)的Copy】
  如果通過
復(fù)制代碼 代碼如下:

o.onclick = test1;

這樣的方式的話,其實是把test1() 這個函數(shù)Copy給了對象 o 的 onclick 屬性。因此test1的擁有者變成了 o 這個對象。
  如果通過
復(fù)制代碼 代碼如下:

o.onclick = test1();

這樣的方式的話,本質(zhì)上是指當(dāng)獲取到點擊事件的handle時,指引它去執(zhí)行test1()函數(shù)。注意是指引去執(zhí)行而不是賦給它去執(zhí)行。test1()的擁有者沒變,還是window.

  【函數(shù)的Refer】
  同上,我們通過inline的方式把調(diào)用寫到html里來調(diào)用的話,還是refer的方式
復(fù)制代碼 代碼如下:

<div id="o" style="width:50px;height:50px;border:4px solid #333" onclick="test1()">me!</div>

點擊div執(zhí)行結(jié)果還是表示this指向window。
  【函數(shù)copy的例子】
復(fù)制代碼 代碼如下:

element.onclick = doSomething
element.addEventListener('click',doSomething,false)
element.onclick = function () {this.style.color = '#cc0000';}
<element onclick="this.style.color = '#cc0000';">

這幾種方式都會使this的指向變?yōu)楫?dāng)前調(diào)用的object。
  【函數(shù)refer的例子】
復(fù)制代碼 代碼如下:

element.onclick = function () {doSomething()}
element.attachEvent('onclick',doSomething)
<element onclick="doSomething()">

這幾種方式都不會改變函數(shù)的擁有者,其中要注意的是addEventListener和attachEvent是不一致的,因為attachEvent其實是建立了一個reference到了doSomething,而不是copy了這個函數(shù)。

  【用call的方式】
剛才我們說了,寫成<element onclick="test()">的方式還是不能讓test()的擁有者變成<element>,那我們可以這樣做
復(fù)制代碼 代碼如下:

<element onclick="test(this)">
function (o) {
o.title = 'me';
}

這樣顯式的調(diào)用是可以的。或者,用call或apply這種對象冒充的繼承方式也可以
復(fù)制代碼 代碼如下:

<element onclick="test.call(this)">
function test () {
this.title = 'me';
}

這也是對象冒充最典型的方式。

  【自由變量問題】
  寫了這么長,我們還是回到最開始的那個問題:
復(fù)制代碼 代碼如下:

var name = 'hong'
var obj = {
name: 'ru',
getName: function(){
return function(){
return this.name;
};
}
}
alert(obj.getName()());

為什么這種方式得到的結(jié)果會是:hong 呢?重點在
復(fù)制代碼 代碼如下:

return function(){
return this.name;
};

對比一下上面寫的函數(shù)refer的例子,不難發(fā)現(xiàn),返回的這個匿名函數(shù)的調(diào)用方式和onclick = function () {doSomething()} 如出一轍。所以這種方式并不會改變這個function的擁有者,它雖然是個嵌套函數(shù),但是它的聲明卻是頂級的。其中的this指向的是window。
  而第二種方式是強(qiáng)制在getName()中把this賦給了that,也就是說,that.name其實和getName()中的this.name是一樣的。而在getName的上下文中,它的擁有者是obj這個對象,所以this會指向obj,故this.name === obj.name;
  繞了這么一大圈不知道有沒有把各位繞明白。

  其實可以這樣總結(jié):在this所在的函數(shù)上下文中,如果這個函數(shù)不是以“方法”的形式被調(diào)用的話,那么這個this會指向window對象,否則會指向這個函數(shù)的擁有者。

相關(guān)文章

  • js簡單判斷flash是否加載完成的方法

    js簡單判斷flash是否加載完成的方法

    這篇文章主要介紹了js簡單判斷flash是否加載完成的方法,通過PercentLoaded方法對flash的加載進(jìn)行判斷,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • JS中的六種繼承方式以及優(yōu)缺點總結(jié)

    JS中的六種繼承方式以及優(yōu)缺點總結(jié)

    JS作為面向?qū)ο蟮娜躅愋驼Z言,繼承也是其非常強(qiáng)大的特性之一,那么如何在JS中實現(xiàn)繼承呢?下面這篇文章主要給大家介紹了關(guān)于JS中六種繼承方式以及優(yōu)缺點的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • javascript實現(xiàn)瀑布流自適應(yīng)遇到的問題及解決方案

    javascript實現(xiàn)瀑布流自適應(yīng)遇到的問題及解決方案

    這篇文章主要介紹了javascript實現(xiàn)瀑布流自適應(yīng)遇到的問題及解決方案,需要的朋友可以參考下
    2015-01-01
  • javascript中的return和閉包函數(shù)淺析

    javascript中的return和閉包函數(shù)淺析

    這篇文章主要介紹了javascript中的return和閉包函數(shù)淺析,至少可以讓你搞懂那么多()是什么意思,需要的朋友可以參考下
    2014-06-06
  • js 原型對象和原型鏈理解

    js 原型對象和原型鏈理解

    本文主要介紹了js原型對象和原型鏈的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • JavaScript 事件查詢綜合

    JavaScript 事件查詢綜合

    比較全的 js事件,大家可以快速的掌握 js事件效果代碼。
    2009-07-07
  • D3.js實現(xiàn)柱狀圖的方法詳解

    D3.js實現(xiàn)柱狀圖的方法詳解

    相信大家都知道數(shù)據(jù)可視化就是借助圖形化的手段把生硬的數(shù)據(jù)生動化,以此來展示出數(shù)據(jù)想要表達(dá)的信息,而圖表是最通常的一種數(shù)據(jù)可視化手段??扇孔约杭兪謩泳帉懜鞣N圖表實在是讓人頭疼,各種計算各種煩。現(xiàn)在就為大家介紹如何用D3.js來實現(xiàn)柱狀圖。
    2016-09-09
  • JavaScript中變量提升和函數(shù)提升實例詳解

    JavaScript中變量提升和函數(shù)提升實例詳解

    這篇文章主要給大家介紹了關(guān)于JavaScript中變量提升和函數(shù)提升的相關(guān)資料,以及JS變量提升和函數(shù)提升的順序,文中給出了詳細(xì)的介紹,需要的朋友可以參考下
    2021-07-07
  • javascript實現(xiàn)倒計時并彈窗提示特效

    javascript實現(xiàn)倒計時并彈窗提示特效

    倒計時的功能在我們做項目的時候會經(jīng)常遇到,這里給大家分享的是個人編寫的一個簡易的效果代碼,有需要的小伙伴可以參考下
    2015-06-06
  • 文字溢出實現(xiàn)溢出的部分再放入一個新生成的div中具體代碼

    文字溢出實現(xiàn)溢出的部分再放入一個新生成的div中具體代碼

    說文字溢出,如何實現(xiàn)溢出的文字放入一個新生成的div中,原理就是判斷是否能在div里放下,如果不能,則在應(yīng)該斷開的地方,差入到新的div中
    2013-05-05

最新評論