Function.prototype.bind 規(guī)范筆記

示例代碼

var thisArg = {};
function targetFunc( arg1, arg2, arg3 ) {
  console.log( this === thisArg );
}

var boundFunc = targetFunc.bind( thisArg, 1, 2 );
// thisArg
boundFunc(); // true
// function name
console.log( targetFunc.name ); // targetFunc
console.log( boundFunc.name ); // bound targetFunc
// the typical number of arguments expected by the function
console.log( targetFunc.length ); // 3
console.log( boundFunc.length ); // 1

以上述代碼為示例,boundFunc 和 targetFunc 的關(guān)系:

基礎(chǔ)

  1. 調(diào)用 boundFunc 函數(shù)就像調(diào)用 targetFunc 函數(shù)一樣蒸苇,只是 boundFunc 內(nèi)部的 this 指向 thisArg。
  2. boundFunc 的名字是 targetFunc 函數(shù)的名字加上前綴:bound缘厢。
  3. boundFunc 形參數(shù)量(boundFunc.length)是 targetFunc 形參數(shù)量減去調(diào)用 targetFunc.bind( thisArg, 1, 2 ) 時候輸入的參數(shù)的數(shù)量台谍。如果調(diào)用 bind 時輸入的參數(shù)數(shù)量大于 targetFunc 的形參數(shù)量,則 boundFunc 的形參數(shù)量為 0(boundFunc.length === 0)匹涮。
function tf(  arg1, arg2, arg3 ) {
}
var bf = tf.bind( null, 1, 2, 3, 4, 5 );
console.log( bf.length ); // 0

高級

bind 返回的 boundFunc 其實不是一般的對象(在 js 中天试,函數(shù)也是一個對象),在規(guī)范中稱之為 exotic object然低,而一般的函數(shù)在規(guī)范中稱之為 ordinary object喜每。區(qū)別在于 exotic object 可能沒有 ordinary object 一些通用的內(nèi)部屬性(internal slot)务唐。譬如:一般的函數(shù)對象有一個內(nèi)部屬性[[Strict]],標(biāo)識這個函數(shù)是否運行在嚴(yán)格模式下带兜,而 boundFunc 沒有枫笛。但是 boundFunc 有如下一些特殊的內(nèi)部屬性:

  1. [[BoundTargetFunction]]:被包裝的函數(shù),即上例中的 targetFunc刚照。
  2. [[BoundThis]]:targetFunc 每次被調(diào)用時刑巧,this 指向的那個值,即上例中的 thisArg涩咖。
  3. [[BoundArguments]]:一個列表海诲,當(dāng) targetFunc 被調(diào)用時候先傳入的參數(shù)們,即上例中的 1檩互,2特幔。

然后運行 boundFunc( argumentsList ) 的過程基本上概括為:

// 假設(shè) argumentsList 是 boundFunc 被調(diào)用時傳入的參數(shù)列表
var argumentsList;
var target = boundFunc.[[BoundTargetFunction]];
var boundThis = boundFunc.[[BoundThis]];
var boundArgs = boundFunc.[[BoundArguments]];
// boundArgs 和 argumentsList 都不是 js array,但是這里作為示例偽代碼 就懶得做轉(zhuǎn)換了闸昨。
var args = boundArgs.concat( argumentsList ); 
target.apply( boundThis, args );

后記

看了一遍 Function.prototype.bind 的規(guī)范蚯斯,發(fā)現(xiàn)沒有什么特別的邊際條件,倒是又引出了兩個主題:函數(shù)作為普通函數(shù)和構(gòu)造函數(shù)分別是如何運行饵较。(接下來準(zhǔn)備為這兩個主題分別總結(jié)下拍嵌,等寫完會 link 到這里的后記里)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市循诉,隨后出現(xiàn)的幾起案子横辆,更是在濱河造成了極大的恐慌,老刑警劉巖茄猫,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狈蚤,死亡現(xiàn)場離奇詭異,居然都是意外死亡划纽,警方通過查閱死者的電腦和手機脆侮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勇劣,“玉大人靖避,你說我怎么就攤上這事”饶” “怎么了幻捏?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長退敦。 經(jīng)常有香客問我粘咖,道長,這世上最難降的妖魔是什么侈百? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任瓮下,我火速辦了婚禮,結(jié)果婚禮上钝域,老公的妹妹穿的比我還像新娘讽坏。我一直安慰自己,他們只是感情好例证,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布路呜。 她就那樣靜靜地躺著,像睡著了一般织咧。 火紅的嫁衣襯著肌膚如雪胀葱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天笙蒙,我揣著相機與錄音抵屿,去河邊找鬼。 笑死捅位,一個胖子當(dāng)著我的面吹牛轧葛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艇搀,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼尿扯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焰雕?” 一聲冷哼從身側(cè)響起衷笋,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矩屁,沒想到半個月后辟宗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡档插,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年慢蜓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郭膛。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡晨抡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出则剃,到底是詐尸還是另有隱情耘柱,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布棍现,位于F島的核電站调煎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏己肮。R本人自食惡果不足惜士袄,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一悲关、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娄柳,春花似錦寓辱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挎挖,卻和暖如春这敬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蕉朵。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工崔涂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人墓造。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓堪伍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親觅闽。 傳聞我的和親對象是個殘疾皇子帝雇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容