javascript的動態this與動態繫結

2021-09-08 23:33:38 字數 4306 閱讀 4078

乙個簡單的例子:

1.window.name ="window";

2.varrun =function()

5.run();

window.name = "window"; var run = function() run()

執行**

這裡你不能說run是作為window的乙個屬性而存在,但它的確是被window屬性呼叫了。實質上大多數暴露在最上層的東西都則window接管了。在它們需要呼叫時被拷貝到window這個物件上(不過在ie中window並不繼承物件),於是有了window['***']與window.***效能上的差異。這是內部實現,不深究了。

另乙個例子,繫結到乙個明確的物件上

1.window.name ="window";

2.object =

7.};

8.object.run();

window.name = "window"; object = }; object.run();

執行**

答案顯然易見,this總是為它的呼叫者。但如果複雜一點呢?

01.window.name ="window";

02.object =

08.inner();

09.}

10.};

11.object.run();

window.name = "window"; object = inner(); } }; object.run();

執行**

01.window.name ="window";

02.varobject =

08.inner.call(this);

09.}

10.}

11.object.run();

window.name = "window"; var object = inner.call(this); } } object.run();

執行**

01.window.name ="window";

02.varcat = ;

05.vardog =

10.};

11.dog.sound(" is pooping");

12.dog.sound.call(window," is banking");

13.dog.sound.call(dog," is banking");

14." miaowing"]);

執行**

由此prototype開發者搞了乙個非常有名的函式出來,bind!以下是它的乙個最簡單的版本:

1.varbind =function(context, fn)

5.}

執行**

不過為了面對更複雜的情況建議用以下版本。

1.functionbind(context,fn) :function() ;

8.};

它還有乙個孿生兄弟叫bindaseventlistener ,繫結事件物件,沒什麼好說的。

1.

2.varbindaseventlistener =function(context, fn)

6.}

prototype的版本

01.function.prototype.bind =function()

09.}

執行**

bind函式是如此有用,google早早已把它加入到function的原型中了(此外還有inherits,mixin與partial)。

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

執行**

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

1.for(variinarray)

4.for(variinarray.prototype)

for(var i in array) for(var i in array.prototype)

執行**

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

1.var_slice = array.prototype.slice;

2.functionunbind(fn) ;

6.};

示例以前也給過了,請見這裡

總結:this 的值取決於 function 被呼叫的方式,一共有四種,

21th 動態規劃 路面修整

fj打算好好修一下農場中某條凹凸不平的土路。按奶牛們的要求,修好後的路面高度應當上公升或下降,也就是說,高度上公升與高度下降的路不能同時出現在修好的路中。整條路被分成了n段,n個整數a 1,a n 依次描述了每一段路的高度。fj希望找到乙個恰好含n個元素的不上公升或不下降序列b 1,b n,作為修過...

JavaScript動態載入

在做專案的過程中需要用到動態載入,如何做,剛開始很為難。什麼是動態載入呢?比如說,新增便簽時,在往庫里插入資料的同時需要顯示在介面上,新增資料後重新整理頁面是可以獲得,但是沒插入一條資料都要重新整理介面的話,不僅麻煩,還很慢。所以就需要用到動態載入。經過不懈努力,其實,也就是動態拼接字串而已。再新增...

Javascript動態修改select選項

1 向select裡新增option js ie only,ff不支援add方法 function fnadditem text,value ie ff both ok function fnadd olistbox,sname,svalue 2 刪除select裡的option js functi...