在JavaScript中鏈接.bind()調(diào)用出乎意料的結(jié)果?
人們很容易想到的bind是莫名其妙地修改函數(shù)使用新的this。在這種(不正確的)解釋中,人們認(rèn)為是bind在函數(shù)中添加了某種魔術(shù)標(biāo)記,告訴該函數(shù)this下次調(diào)用時(shí)將使用其他標(biāo)記。如果真是這樣,那么應(yīng)該有可能“覆蓋”并更改魔術(shù)標(biāo)記。然后有人會(huì)問(wèn),任意限制能力的原因是什么?
但是實(shí)際上,這 它的工作原理。,當(dāng)調(diào)用時(shí)將調(diào)用一個(gè)具有特定特性的第一個(gè)函數(shù)this。使用這個(gè)新創(chuàng)建的函數(shù)的行為,指定this調(diào)用原有的功能,是在焚燒時(shí)產(chǎn)生的功能時(shí)。在更改之后,不能再對(duì)其進(jìn)行任何其他更改,而只能更改該函數(shù)返回的任何其他函數(shù)的內(nèi)部。
查看以下內(nèi)容的簡(jiǎn)單實(shí)現(xiàn)可能會(huì)有所幫助bind:
// NOT the real bind; just an exampleFunction.prototype.bind = function(ctxt) { var fn = this; return function bound_fn() {return fn.apply(ctxt, arguments); };}my_bound_fn = original_fn.bind(obj);
如您所見(jiàn),在中bound_fn,從中返回的函數(shù)bind沒(méi)有地方引用this調(diào)用綁定函數(shù)的。它被忽略,所以
my_bound_fn.call(999, arg) // 999 is ignored
要么
obj = { fn: function () { console.log(this); } };obj.fn = obj.fn.bind(other_obj);obj.fn(); // outputs other_obj; obj is ignored
因此,我可以綁定從bind“再次”返回的函數(shù),但這重新綁定原始函數(shù)。它僅綁定外部函數(shù),而對(duì)內(nèi)部函數(shù)沒(méi)有影響,因?yàn)橐呀?jīng)設(shè)置為使用this傳遞給的上下文(值)調(diào)用基礎(chǔ)函數(shù)bind。我可以一次又一次地綁定,但最終要做的是創(chuàng)建更多的外部函數(shù),這些函數(shù)可以綁定到某些東西上,但仍然最終調(diào)用從第一個(gè)返回的最里面的函數(shù)bind。
因此,說(shuō)bind“不能被覆蓋” 有點(diǎn)誤導(dǎo)。
如果我想“重新綁定”一個(gè)函數(shù),那么我可以對(duì)原始函數(shù)進(jìn)行新的綁定。因此,如果我綁定一次:
function orig() { }my_bound_fn = orig.bind(my_obj);
然后我想安排我的原始函數(shù)與其他函數(shù)調(diào)用this,那么我不重新綁定綁定函數(shù):
my_bound_fn = my_bound_fn.bind(my_other_obj); // No effect
相反,我只是創(chuàng)建了一個(gè)綁定到原始函數(shù)的新函數(shù):
my_other_bound_fn = orig.bind(my_other_obj);解決方法
從MDN:
bind()方法創(chuàng)建一個(gè)新函數(shù),該函數(shù)在調(diào)用時(shí)將其this關(guān)鍵字設(shè)置為提供的值
我可以很高興地看到它在此示例中有效:
(function () { console.log(this);}).bind({foo:'bar'})();
哪個(gè)日志Object { foo='bar'}。
但是,如果我鏈接了另一個(gè)綁定調(diào)用,甚至是“調(diào)用”調(diào)用,我仍然會(huì)使用分配給第一個(gè)綁定的對(duì)象的“ this”來(lái)調(diào)用函數(shù)。例子:
(function () { console.log(this);}).bind({foo:'bar'}).bind({oof:'rab'})();
和
(function () { console.log(this);}).bind({foo:'bar'}).call({oof:'rab'});
兩者都記錄了日志,Object { foo='bar'}而不是我期望的:Object { oof='rab'}。
無(wú)論我鏈接多少個(gè)綁定調(diào)用,似乎只有第一個(gè)都起作用。
為什么?
這可能會(huì)有所幫助。我剛剛發(fā)現(xiàn)jQuery的版本行為相同!:O
jQuery.proxy( jQuery.proxy(function() { console.log(this); },{foo:'bar'}),{oof:'rab'})();
日志 Object { foo='bar'}
相關(guān)文章:
1. boot2docker無(wú)法啟動(dòng)2. docker-compose中volumes的問(wèn)題3. 關(guān)docker hub上有些鏡像的tag被標(biāo)記““This image has vulnerabilities””4. java - SSH框架中寫(xiě)分頁(yè)時(shí)service層中不能注入分頁(yè)類5. nignx - docker內(nèi)nginx 80端口被占用6. docker安裝后出現(xiàn)Cannot connect to the Docker daemon.7. javascript - mock.js可以存儲(chǔ)數(shù)據(jù)嗎8. docker api 開(kāi)發(fā)的端口怎么獲取?9. docker images顯示的鏡像過(guò)多,狗眼被亮瞎了,怎么辦?10. golang - 用IDE看docker源碼時(shí)的小問(wèn)題

網(wǎng)公網(wǎng)安備