国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

一行代碼看懂bind,call

Lavender / 898人閱讀

摘要:代碼方法返回一個(gè)新的數(shù)組對(duì)象原數(shù)組的淺拷貝,常用于動(dòng)態(tài)解析參數(shù)。看過(guò)的童鞋,對(duì)這行代碼不會(huì)陌生。所以筆者覺(jué)得,從理解角度來(lái)看,新創(chuàng)建的函數(shù)命名為更便于理解。總結(jié)乍一看,函數(shù)有點(diǎn)繞,一經(jīng)推敲還是很好理解的。

代碼
var slice = Function.prototype.call.bind(Array.prototype.slice);

slice() 方法返回一個(gè)新的數(shù)組對(duì)象(原數(shù)組的淺拷貝),常用于動(dòng)態(tài)解析參數(shù)。看過(guò)MDN的童鞋,對(duì)這行代碼不會(huì)陌生。MDN上的描述比較官方,下面我們通過(guò)對(duì)這行代碼的知識(shí)點(diǎn)的逐一分析來(lái)加深理解。

Function.prototype.call

call :臨時(shí)性的改變一個(gè)函數(shù)的this。原本函數(shù)是誰(shuí)調(diào)用,this就指向誰(shuí)。call是通過(guò)第一個(gè)參數(shù),告訴函數(shù)本次調(diào)用者另有其人,然后接著傳入?yún)?shù):

fun.call(thisArg, arg1, arg2, ...)

測(cè)試demo:

function testCall(){console.log(this)}
testCall()
//Window {postMessage: ?, blur: ?, focus: ?, close: ?, parent: Window, …}
testCall.call({})
//{}
testCall()
//Window {postMessage: ?, blur: ?, focus: ?, close: ?, parent: Window, …}
Function.prototype.bind

bind:創(chuàng)建一個(gè)新的函數(shù),新函數(shù)的this永久指向第一個(gè)參數(shù):

fun.bind(thisArg[, arg1[, arg2[, ...]]])

測(cè)試demo:

var t={testBind(){console.log(this)}}
t.testBind()
//{testBind: ?}
t.testBind2=t.testBind.bind({x:1})
t.testBind2()
//{x: 1} 雖然調(diào)用的還是t,但是this指向的還是bind的
t.testBind()
//{testBind: ?, testBind2: ?}
t.testBind2===t.testBind
//false

使用bind去創(chuàng)建的新函數(shù)的頻次并不高,筆者表示從沒(méi)用到過(guò)~
實(shí)用一點(diǎn)的是MDN上介紹的偏函數(shù),即使函數(shù)預(yù)設(shè)參數(shù):

//來(lái)源MDN
function list() {
  return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

// Create a function with a preset leading argument
var leadingThirtysevenList = list.bind(undefined, 37);

var list2 = leadingThirtysevenList(); // [37]
var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]

var leadingThirtysevenList = list.bind(undefined, 37,38,39,40);
leadingThirtysevenList();//[37, 38, 39, 40]
leadingThirtysevenList(1,2,3);//[37, 38, 39, 40, 1, 2, 3]

另外一個(gè)實(shí)用的地方就是文章開(kāi)頭寫(xiě)的快捷調(diào)用了:

var slice = Function.prototype.call.bind(Array.prototype.slice);

經(jīng)過(guò)前面的了解,我們?cè)賮?lái)分析下這段代碼:
使用bindcall函數(shù)的this永久綁定Array.prototype.slice函數(shù),返回一個(gè)新的call函數(shù),我們打印一下:

slice
// ? call() { [native code] }

slice({length:1})等價(jià)于Array.prototype.slice.call({length:1}),也就是說(shuō)創(chuàng)建的slicecall 函數(shù)的一個(gè)變體,是call 函數(shù)的一個(gè)變體,是call 函數(shù)的一個(gè)變體。所以筆者覺(jué)得,從理解角度來(lái)看,新創(chuàng)建的函數(shù)slice 命名為newCall更便于理解。

總結(jié)

乍一看,newCallslice函數(shù)有點(diǎn)繞,一經(jīng)推敲還是很好理解的。由此我們也可以寫(xiě)出來(lái)更多的newCall(快捷調(diào)用),例如精確類(lèi)型判斷需要用到的toString

var toString=Function.prototype.call.bind(Object.prototype.toString)
toString({})
//"[object Object]"
toString(1)
//"[object Number]"
toString(null)
//"[object Null]"
toString()
//"[object Undefined]"
toString(false)
//"[object Boolean]"
toString(function(){})
//"[object Function]"

MDN文檔:

MDN-call
MDN-bind

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/108573.html

相關(guān)文章

  • JS 兼容、繼承、bind、this

    摘要:我們都說(shuō)構(gòu)造函數(shù)開(kāi)頭首字母大寫(xiě)但那只是人為的規(guī)定并不是語(yǔ)法。只是一個(gè)操作符,任何函數(shù)都能通過(guò)來(lái)執(zhí)行,并不只是構(gòu)造函數(shù),只不過(guò)我們認(rèn)為之后的都是構(gòu)造函數(shù)。 這一篇文章主要是講述一些有關(guān)js的小知識(shí)點(diǎn)。因?yàn)槲乙膊皇呛芫囊环矫嬷荒馨炎约褐赖囊稽c(diǎn)點(diǎn)寫(xiě)出來(lái)。取名大雜燴也是這意思吧,既然是道菜那么就來(lái)嘗嘗我的手藝吧。 第一道菜 1.首先,我想說(shuō)一下事件綁定。事件綁定我們都知道有:on + t...

    YacaToy 評(píng)論0 收藏0
  • Javascript之bind

    摘要:返回的函數(shù)可以作為構(gòu)造函數(shù)使用被用作構(gòu)造函數(shù)時(shí),應(yīng)指向出來(lái)的實(shí)例,同時(shí)有屬性,其指向?qū)嵗脑汀E袛喈?dāng)前被調(diào)用時(shí),是用于普通的還是用于構(gòu)造函數(shù)從而更改指向。運(yùn)算符用來(lái)測(cè)試一個(gè)對(duì)象在其原型鏈中是否存在一個(gè)構(gòu)造函數(shù)的屬性。 寫(xiě)在最前 最近開(kāi)始重新學(xué)習(xí)一波js,框架用久了有些時(shí)候覺(jué)得這樣子應(yīng)該可以實(shí)現(xiàn)發(fā)現(xiàn)就真的實(shí)現(xiàn)了,但是為什么這么寫(xiě)好像又說(shuō)不太清楚,之前讀了LucasHC以及冴羽的兩篇關(guān)于...

    王巖威 評(píng)論0 收藏0
  • callbind的模擬實(shí)現(xiàn)

    摘要:大致就是這樣所以可以模擬實(shí)現(xiàn)和。這些參數(shù)作為的第二個(gè)參數(shù)跟在后面,之后它們會(huì)被插入到目標(biāo)函數(shù)的參數(shù)列表的開(kāi)始位置,傳遞給綁定函數(shù)的參數(shù)會(huì)跟在它們的后面。 一個(gè)前端知識(shí)點(diǎn)匯總綜合了學(xué)習(xí)過(guò)程中的知識(shí)點(diǎn),比如this、閉包、BFC、ES6等,如果大佬們覺(jué)得還可以的話,求個(gè)star啦! call和apply 每個(gè)函數(shù)都包含兩個(gè)非繼承而來(lái)的方法:apply()和call() 用途相同,都是在...

    mmy123456 評(píng)論0 收藏0
  • 一行等式理解JS當(dāng)中的call, apply和bind

    摘要:所以,這篇文章將通過(guò)一段非常簡(jiǎn)潔的等式,把當(dāng)中一個(gè)相對(duì)較難的知識(shí)點(diǎn),,和給串聯(lián)起來(lái)要理解當(dāng)中的這三個(gè)關(guān)鍵字,首先得弄清楚它們是用來(lái)干嘛的。方案讓吃掉,直接消化吸收的所有能力。 關(guān)于JS當(dāng)中的call,apply和bind,相信大家和我一樣,已經(jīng)看過(guò)了無(wú)數(shù)篇相關(guān)的文章,都有自己的理解。所以這篇文章并非什么科普類(lèi)的文章,僅僅是把我自己的理解記錄下來(lái)。 我的學(xué)習(xí)習(xí)慣,是喜歡把各種看似孤立的知...

    CarterLi 評(píng)論0 收藏0
  • 進(jìn)擊的 JavaScript(六) 之 this

    摘要:綁定為這個(gè)數(shù)組五綁定如果使用來(lái)創(chuàng)建對(duì)象,因?yàn)楹竺娓氖菢?gòu)造函數(shù),所以稱(chēng)它為構(gòu)造器調(diào)用。為傳進(jìn)來(lái)的構(gòu)造函數(shù)你這要看懂這步就行。 記得剛開(kāi)始,我理解 this 的時(shí)候 也是云里霧里的,哈哈,希望通過(guò)這篇文章,對(duì)你有幫助吧。 關(guān)于 this 最多的說(shuō)法,就是:誰(shuí)調(diào)用它,this就指向誰(shuí)。這話呢,不能說(shuō)它錯(cuò)了,只能說(shuō)它講的不嚴(yán)謹(jǐn),為什么呢?我們先來(lái)了解下 this 的幾種綁定規(guī)則。 一...

    chemzqm 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<