午夜视频在线观看区二区-午夜视频在线观看视频-午夜视频在线观看视频在线观看-午夜视频在线观看完整高清在线-午夜视频在线观看网站-午夜视频在线观看亚洲天堂

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

javascript 的動態(tài)this與動態(tài)綁定

admin
2010年8月13日 23:16 本文熱度 4441

在 JavaScript 中,函數(shù)通常運行在一個特定的上下文中(通常稱為“作用域[scope]”)。在函數(shù)內(nèi)部, this 關(guān)鍵字是指向那個作用域的引用。實際上,每個函數(shù)都是對象的屬性——全局函數(shù)是 window 對象的屬性——運行時函數(shù)的作用域即為函數(shù)被調(diào)用時函數(shù)所屬的對象, 更嚴格的說法是保存了對函數(shù)的引用的對象。
javascript是一門動態(tài)語言,最明顯就是那個dynamic this。它一般都是作為函數(shù)調(diào)用者存在。在javascript,所有關(guān)系都可以作為對象的一個關(guān)聯(lián)數(shù)組元素而存在。那么函數(shù)就是被掰成兩部分儲存于對象,一是其函數(shù)名(鍵),一是函數(shù)體(值),那么函數(shù)中的this一般都指向函數(shù)所在的對象。但這是一般而已,在全局調(diào)用函數(shù)時,我們并沒有看到調(diào)用者,或者這時就是window。不過,函數(shù)聲明后,其實并沒有綁定到任何對象,因此我們可以用call apply這些方法設(shè)置調(diào)用者。


一個簡單的例子:





提示:你可以先修改部分代碼再運行。


這里你不能說run是作為window的一個屬性而存在,但它的確是被window屬性調(diào)用了。實質(zhì)上大多數(shù)暴露在最上層的東西都則window接管了。在它們需要調(diào)用時被拷貝到window這個對象上(不過在IE中window并不繼承對象),于是有了window['xxx']與 window.xxx性能上的差異。這是內(nèi)部實現(xiàn),不深究了。


另一個例子,綁定到一個明確的對象上



提示:你可以先修改部分代碼再運行。


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




提示:你可以先修改部分代碼再運行。


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




提示:你可以先修改部分代碼再運行。


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




提示:你可以先修改部分代碼再運行。


由此Prototype開發(fā)者搞了一個非常有名的函數(shù)出來,bind!以下是它的一個最簡單的版本:









2   return function() {






3     return fn.apply(context, arguments);






4   }






5 }



提示:你可以先修改部分代碼再運行。


不過為了面對更復(fù)雜的情況建議用以下版本。









1 function bind(context,fn) {






2   var args = Array.prototype.slice.call(arguments, 2);






3   return args.length == 0 ? function() {






4     return fn.apply(context, arguments);






5   } : function() {

它還有一個孿生兄弟叫bindAsEventListener ,綁定事件對象,沒什么好說的。








1 var bindAsEventListener = function(context, fn) {






2     return function(e) {






3         return fn.call(context, (e|| window.event));






4     }






5 }
Prototype的版本








1 Function.prototype.bind = function() {






2    if (arguments.length < 2 && (typeof arguments[0]==='undefined'))






3      return this;






4    var _slice = Array.prototype.slice






5    var __method = this, args = _slice.call(arguments,0), context = args.shift();






6    return function() {






7      return __method.apply(context, args.concat(_slice.call(arguments,0)));






8    }






9  }



提示:你可以先修改部分代碼再運行。


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









1 for(var i in Array){






2   alert(i + " : "+ Array[i])






3 }






4 for(var i in Array.prototype){






5   alert(i + " : "+ Array.prototype[i])






6 }

要取出它們就需要這個東西:









1 var _slice = Array.prototype.slice;






2 function unbind(fn) {//第一步取得泛化方法






3   return function(context) {//第二部用對應(yīng)原生對象去重新調(diào)用!






4     return fn.apply(context, _slice.call(arguments, 1));






5   };






6 };

總結(jié):


this 的值取決于 function 被調(diào)用的方式,一共有四種,


* 如果一個 function 是一個對象的屬性,該 funtion 被調(diào)用的時候,this 的值是這個對象。如果 function 調(diào)用的表達式包含句點(.)或是 [],this 的值是句點(.)或是 [] 之前的對象。如myObj.func 和myObj["func"] 中,func 被調(diào)用時的 this 是myObj。
* 如果一個 function 不是作為一個對象的屬性,那么該 function 被調(diào)用的時候,this 的值是全局對象。當一個 function 中包含內(nèi)部 function 的時候,如果不理解 this 的正確含義,很容易造成錯誤。這是由于內(nèi)部 function 的 this 值與它外部的 function 的 this 值是不一樣的。解決辦法是將外部 function 的 this 值保存在一個變量中,在內(nèi)部 function 中使用它來查找變量。
* 如果在一個 function 之前使用 new 的話,會創(chuàng)建一個新的對象,該 funtion 也會被調(diào)用,而 this 的值是新創(chuàng)建的那個對象。如function User(name) {this.name = name}; var user1 = new User(”Alex”); 中,通過調(diào)用new User(”Alex”) ,會創(chuàng)建一個新的對象,以user1 來引用,User 這個 function 也會被調(diào)用,會在user1 這個對象中設(shè)置名為name 的屬性,其值是Alex 。
* 可以通過 function 的 apply 和 call 方法來指定它被調(diào)用的時候的 this 的值。 apply 和 call 的第一個參數(shù)都是要指定的 this 的值。由于它們存在,我們得以創(chuàng)建各種有用的函數(shù)。


該文章在 2010/8/13 23:16:49 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产一区麻豆剧传媒果冻精品 | 91一区二区三区久久国产乱 | 国产91对白在线观看 | 国自产拍偷拍精品啪啪一区二 | 国产精品日产无码av永久不卡 | 国产精品无码播放 | 精品国产成人亚洲午夜福利 | 国产在线观看超清无码视频一区二区 | 国产美女裸体露胸网站 | 国产一区二区成人av在线播放 | 国产一区二区三区高潮老年人 | 国内免费一区二区三区 | 国产亚洲日韩中文字幕欧美视频 | 91成人国产综合久久精品 | 国产高潮流白浆视频在线观看 | 国产成人精品高清在线观看 | 国产精品色欲av蜜臀麻豆 | 爆乳无码av一区二区三区 | 精品人妻无码久久久久久 | 国产亚洲欧美日韩在线观看一区二区 | 精品国产免费午夜剧场 | 爆操欧美美女 | 国产人妖乱国产精品人妖 | 丰满的少妇69式视频在线观看 | av动漫无码不卡在线观看 | 精品精品国产高清a毛片 | 国产精品无码一区二区在线国 | 国产精品一区二区久久 | 国产精品日韩欧美一区2区3区 | 国模一区二区三区 | av专区一区二区三区 | 国产麻豆精品久久一二三 | 国产成人精品久久亚洲高清不卡p | 国产成人精品久久综合电影 | 18禁成年无码免费网站无遮 | 国产三级在线观看免费 | 精品久久人妻av中文 | 国产美女一级性大黄片 | 国产成人精品久久二区二区 | av天堂午夜精品一区 | 国产在线高清理伦片a电影 国产在线高清仑片a |