天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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

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

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

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
答案顯然易見,this總是為它的調(diào)用者。但如果復(fù)雜一點(diǎn)呢?

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

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
call與apply的區(qū)別在于第一個參數(shù)以后的參數(shù)的形式,call是一個個,aplly則都放到一個數(shù)組上,在參數(shù)不明確的情況,我們可以借助arguments與Array.slice輕松搞定。

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
由此Prototype開發(fā)者搞了一個非常有名的函數(shù)出來,bind!以下是它的一個最簡單的版本:
復(fù)制代碼 代碼如下:
var bind = function(context, fn) {
return function() {
return fn.apply(context, arguments);
}
}


[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
不過為了面對更復(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));
};
};

它還有一個孿生兄弟叫bindAsEventListener ,綁定事件對象,沒什么好說的。
復(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)));
}
}


[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
bind函數(shù)是如此有用,google早早已把它加入到Function的原型中了(此外還有inherits,mixin與partial)。
復(fù)制代碼 代碼如下:
//在chrome中
var a = function(){};
alert(a.bind)

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

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
要取出它們就需要這個東西:
復(fù)制代碼 代碼如下:
var _slice = Array.prototype.slice;
function unbind(fn) {//第一步取得泛化方法
return function(context) {//第二部用對應(yīng)原生對象去重新調(diào)用!
return fn.apply(context, _slice.call(arguments, 1));
};
};

示例以前也給過了,請見文章
總結(jié):
this 的值取決于 function 被調(diào)用的方式,一共有四種,
如果一個 function 是一個對象的屬性,該 funtion 被調(diào)用的時候,this 的值是這個對象。如果 function 調(diào)用的表達(dá)式包含句點(diǎn)(.)或是 [],this 的值是句點(diǎn)(.)或是 [] 之前的對象。如myObj.func 和myObj["func"] 中,func 被調(diào)用時的 this 是myObj。
如果一個 function 不是作為一個對象的屬性,那么該 function 被調(diào)用的時候,this 的值是全局對象。當(dāng)一個 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ù)。

JavaScript技術(shù)javascript下動態(tài)this與動態(tài)綁定實(shí)例代碼,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产高清在线观看视频 | 欧美日韩午夜群交多人轮换 | 伦理片92伦理午夜 | 伊人网中文字幕 | 攻把受做哭边走边肉楼梯PLAY | 被吊起玩弄的女性奴 | 艳鉧动漫1~6全集观看在线 | 秋秋影视午夜福利高清 | 天天色天天干天天 | 日本六九视频 | 91嫩草私人成人亚洲影院 | 秋霞电影午夜伦午夜 | 人妻中文字幕无码久久AV爆 | 中文字幕永久在线 | 第一福利视频网站在线 | 青柠在线观看视频在线高清 | 4455永久在线毛片观看 | 久久国产加勒比精品无码 | 鸭子玩富婆流白浆视频 | 亚洲免费一 | 翁止熄痒禁伦短文合集免费视频 | 欧美一级久久久久久久大 | 男人J放进女人屁股免费观看 | 麻豆产精品一二三产区区 | 91精选国产 | 午夜免费福利小电影 | 亚洲精品成人AV在线观看爽翻 | 欧美又粗又大AAAA片 | 91亚洲精品福利在线播放 | 亚婷婷洲AV久久蜜臀无码 | 国产黄片毛片 | 在教室轮流被澡高H林萌 | 善良的小峓子2在钱中文版女主角 | 国产女人91精品嗷嗷嗷嗷 | 久久婷婷五月免费综合色啪 | 色播播影院 | 成人无码精品一区二区在线观看 | 亚洲精品不卡在线 | 久久妇女高潮几次MBA | 午夜免费无码福利视频麻豆 | 末成年美女黄网站色大片连接 |