最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript下動(dòng)態(tài)this與動(dòng)態(tài)綁定實(shí)例代碼

 更新時(shí)間:2010年01月05日 13:25:46   作者:  
javascript是一門動(dòng)態(tài)語(yǔ)言,最明顯就是那個(gè)dynamic this。它一般都是作為函數(shù)調(diào)用者存在。在javascript,所有關(guān)系都可以作為對(duì)象的一個(gè)關(guān)聯(lián)數(shù)組元素而存在。

那么函數(shù)就是被掰成兩部分儲(chǔ)存于對(duì)象,一是其函數(shù)名(鍵),一是函數(shù)體(值),那么函數(shù)中的this一般都指向函數(shù)所在的對(duì)象。但這是一般而已,在全局調(diào)用函數(shù)時(shí),我們并沒(méi)有看到調(diào)用者,或者這時(shí)就是window。不過(guò),函數(shù)聲明后,其實(shí)并沒(méi)有綁定到任何對(duì)象,因此我們可以用call apply這些方法設(shè)置調(diào)用者。

一個(gè)簡(jiǎn)單的例子:
[script]
<script>
window.name = "window";
var run = function() {
alert("My name is " + this.name);
}
run();
</script>
[/html]
這里你不能說(shuō)run是作為window的一個(gè)屬性而存在,但它的確是被window屬性調(diào)用了。實(shí)質(zhì)上大多數(shù)暴露在最上層的東西都則window接管了。在它們需要調(diào)用時(shí)被拷貝到window這個(gè)對(duì)象上(不過(guò)在IE中window并不繼承對(duì)象),于是有了window['xxx']與window.xxx性能上的差異。這是內(nèi)部實(shí)現(xiàn),不深究了。
另一個(gè)例子,綁定到一個(gè)明確的對(duì)象上


答案顯然易見(jiàn),this總是為它的調(diào)用者。但如果復(fù)雜一點(diǎn)呢?

盡管它是定義在object內(nèi)部,盡管它是定義run函數(shù)內(nèi)部,但它彈出的既不是object也不是run,因?yàn)樗炔皇莖bject的屬性也不是run的屬性。它松散在存在于run的作用域用,不能被前兩者調(diào)用,就只有被window拯救。window等原生對(duì)象浸透于在所有腳本的內(nèi)部,無(wú)孔不入,只要哪里需要到它做貢獻(xiàn)的地方,它都義不容辭。但通常我們不需要它來(lái)幫倒忙,這就需要奠出call與apply兩大利器了。

call與apply的區(qū)別在于第一個(gè)參數(shù)以后的參數(shù)的形式,call是一個(gè)個(gè),aplly則都放到一個(gè)數(shù)組上,在參數(shù)不明確的情況,我們可以借助arguments與Array.slice輕松搞定。

由此Prototype開(kāi)發(fā)者搞了一個(gè)非常有名的函數(shù)出來(lái),bind!以下是它的一個(gè)最簡(jiǎn)單的版本:
復(fù)制代碼 代碼如下:

var bind = function(context, fn) {
return function() {
return fn.apply(context, arguments);
}
}


不過(guò)為了面對(duì)更復(fù)雜的情況建議用以下版本。
復(fù)制代碼 代碼如下:

function bind(context,fn) {
var args = Array.prototype.slice.call(arguments, 2);
return args.length == 0 ? function() {
return fn.apply(context, arguments);
} : function() {
return fn.apply(context, args.concat.apply(args, arguments));
};
};

它還有一個(gè)孿生兄弟叫bindAsEventListener ,綁定事件對(duì)象,沒(méi)什么好說(shuō)的。
復(fù)制代碼 代碼如下:

var bindAsEventListener = function(context, fn) {
return function(e) {
return fn.call(context, (e|| window.event));
}
}

Prototype的版本
復(fù)制代碼 代碼如下:

Function.prototype.bind = function() {
if (arguments.length < 2 && (typeof arguments[0]==='undefined'))
return this;
var _slice = Array.prototype.slice
var __method = this, args = _slice.call(arguments,0), context = args.shift();
return function() {
return __method.apply(context, args.concat(_slice.call(arguments,0)));
}
}


bind函數(shù)是如此有用,google早早已把它加入到Function的原型中了(此外還有inherits,mixin與partial)。
復(fù)制代碼 代碼如下:

//在chrome中
var a = function(){};
alert(a.bind)

有綁定就有反綁定,或者叫剝離更好!例如原生對(duì)象的泛化方法我們是無(wú)法通過(guò)遍歷取出它們的。

要取出它們就需要這個(gè)東西:
復(fù)制代碼 代碼如下:

var _slice = Array.prototype.slice;
function unbind(fn) {//第一步取得泛化方法
return function(context) {//第二部用對(duì)應(yīng)原生對(duì)象去重新調(diào)用!
return fn.apply(context, _slice.call(arguments, 1));
};
};

示例以前也給過(guò)了,請(qǐng)見(jiàn)文章
總結(jié):
this 的值取決于 function 被調(diào)用的方式,一共有四種,
如果一個(gè) function 是一個(gè)對(duì)象的屬性,該 funtion 被調(diào)用的時(shí)候,this 的值是這個(gè)對(duì)象。如果 function 調(diào)用的表達(dá)式包含句點(diǎn)(.)或是 [],this 的值是句點(diǎn)(.)或是 [] 之前的對(duì)象。如myObj.func 和myObj["func"] 中,func 被調(diào)用時(shí)的 this 是myObj。
如果一個(gè) function 不是作為一個(gè)對(duì)象的屬性,那么該 function 被調(diào)用的時(shí)候,this 的值是全局對(duì)象。當(dāng)一個(gè) function 中包含內(nèi)部 function 的時(shí)候,如果不理解 this 的正確含義,很容易造成錯(cuò)誤。這是由于內(nèi)部 function 的 this 值與它外部的 function 的 this 值是不一樣的。解決辦法是將外部 function 的 this 值保存在一個(gè)變量中,在內(nèi)部 function 中使用它來(lái)查找變量。
如果在一個(gè) function 之前使用 new 的話,會(huì)創(chuàng)建一個(gè)新的對(duì)象,該 funtion 也會(huì)被調(diào)用,而 this 的值是新創(chuàng)建的那個(gè)對(duì)象。如function User(name) {this.name = name}; var user1 = new User("Alex"); 中,通過(guò)調(diào)用new User("Alex") ,會(huì)創(chuàng)建一個(gè)新的對(duì)象,以u(píng)ser1 來(lái)引用,User 這個(gè) function 也會(huì)被調(diào)用,會(huì)在user1 這個(gè)對(duì)象中設(shè)置名為name 的屬性,其值是Alex 。
可以通過(guò) function 的 apply 和 call 方法來(lái)指定它被調(diào)用的時(shí)候的 this 的值。 apply 和 call 的第一個(gè)參數(shù)都是要指定的 this 的值。由于它們存在,我們得以創(chuàng)建各種有用的函數(shù)。

相關(guān)文章

  • 淺談Axios去除重復(fù)請(qǐng)求方案

    淺談Axios去除重復(fù)請(qǐng)求方案

    本文主要介紹了Axios去除重復(fù)請(qǐng)求方案,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • window.open()詳解及瀏覽器兼容性問(wèn)題示例探討

    window.open()詳解及瀏覽器兼容性問(wèn)題示例探討

    這篇文章主要介紹了window.open()的使用及瀏覽器兼容性問(wèn)題方面的知識(shí),感興趣的朋友可以參考下
    2014-05-05
  • layer插件select選中默認(rèn)值的方法

    layer插件select選中默認(rèn)值的方法

    今天小編就為大家分享一篇layer插件select選中默認(rèn)值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 簡(jiǎn)單實(shí)用的HTML到UBB轉(zhuǎn)換腳本工具實(shí)現(xiàn)說(shuō)明

    簡(jiǎn)單實(shí)用的HTML到UBB轉(zhuǎn)換腳本工具實(shí)現(xiàn)說(shuō)明

    你也許是位樂(lè)于分享的技術(shù)人員,盡管你算不上什么技術(shù)高手,但是你都希望把自己所知道的通過(guò)博客與網(wǎng)友分享。為了讓更多人知道你的經(jīng)驗(yàn),你可能會(huì)努力把博文發(fā)布到專業(yè)論壇。
    2009-11-11
  • 解析Javascript單例模式概念與實(shí)例

    解析Javascript單例模式概念與實(shí)例

    本文將介紹Javascript模式中較為常見(jiàn)和實(shí)用的模式——單例模式,主要分為概念和實(shí)例部分。在介紹實(shí)例的同時(shí)也會(huì)對(duì)代碼中額外的知識(shí)點(diǎn)進(jìn)行講解。需要的朋友可以看下
    2016-12-12
  • 詳解JavaScript的計(jì)時(shí)器和按鈕效果設(shè)置

    詳解JavaScript的計(jì)時(shí)器和按鈕效果設(shè)置

    這篇文章主要為大家介紹了JavaScript的計(jì)時(shí)器和按鈕效果設(shè)置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • 利用Math.js解決JS計(jì)算小數(shù)精度丟失問(wèn)題

    利用Math.js解決JS計(jì)算小數(shù)精度丟失問(wèn)題

    電商系統(tǒng)中訂單、庫(kù)存中有數(shù)字等加減乘除算術(shù),下面這篇文章主要給大家介紹了關(guān)于利用Math.js解決JS計(jì)算小數(shù)精度丟失問(wèn)題的相關(guān)資料,mathjs是一個(gè)前端在計(jì)算上面必定會(huì)用到的類庫(kù),需要的朋友可以參考下
    2022-04-04
  • 工作中常用js功能匯總

    工作中常用js功能匯總

    這篇文章主要介紹了一些工作中常用js功能的匯總,幫助大家提高工作效率,加深對(duì)js的理解,感興趣的朋友可以了解下
    2020-11-11
  • javascript實(shí)現(xiàn)留言板功能

    javascript實(shí)現(xiàn)留言板功能

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)留言板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • js觀察者模式的彈幕案例

    js觀察者模式的彈幕案例

    這篇文章主要為大家詳細(xì)介紹了js觀察者模式的彈幕案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評(píng)論

瓮安县| 卢湾区| 绥江县| 林周县| 福州市| 和硕县| 仙桃市| 喜德县| 油尖旺区| 青冈县| 砚山县| 揭西县| 库尔勒市| 全州县| 秭归县| 东莞市| 文昌市| 老河口市| 上蔡县| 遂川县| 寿宁县| 潜山县| 博客| 革吉县| 武胜县| 平顶山市| 江都市| 乌兰县| 富源县| 醴陵市| 阿克| 怀集县| 杨浦区| 汉阴县| 定远县| 天水市| 安化县| 颍上县| 临夏市| 凤阳县| 新田县|