function .aplly() .call() 與 arguments
2017-05-21前端筆記
其實都圍繞著this
小弟剛入行時對this
的印象就是用在物件 method 中,直接取得物件本身的 property:
1 | function fullName(){ |
或是用於建構新物件用的 function constructor:
1 | function star(firstName, lastName){ |
但也曾經一度誤解this
是「專屬於物件的、不管怎樣都是指物件本身」的指標。
結果用 jQuery 有 $(this)
,某些情況指到不是自己要的對象,需要搭配 .bind()
的問題,稍微有點頭緒後,又在讀前輩 code 時看到完全陌生的 .apply()
跟 .call()
,一查之下才發現根本是 function 的原生 method 三兄弟,而且都跟 this
有關!腦洞越攪越大、債越背越多,不研究一下不行惹。
估狗
於是拜讀這兩篇比較淺顯易懂的:
筆記
this
參照呼叫的主體,如第一段 code 中是 JC 呼叫的,所以 fullName() 的this
參照的是 JC 物件本身。.call()
能直接指定this
參照至第一個參數,如以下這樣寫,結果與第一段 code 相同。
1 | console.log(fullName.call(JC)); // "Jim Carrey" |
若是有參數的 function ,則接續在之後如function.call( someObj, arg1, arg2, ...)
.apply()
效果同.call()
,只是用 Array 帶進 arguments 如function.apply( someObj, [ arg1, arg2, ... ])
實務上 - 借別人的 method 來用
1 | var numbers = [ 5, 458 , 120 , -215 ]; |
number 本身没有 max 方法,但是 Math 有,我们就可以借助 call 或者 apply 使用其方法。
那什麼是 arguments (引數)?
常跟 parameters (參數) 搞混的名詞,中文翻譯也常常兩個 cosplay 對方,攻城屍還是多用英文吧。
個人是理解為: parameters 是 function 在定義時宣告要使用的 variables,而 arguments 是 function 在執行時被賦值後的 variables,同時 function 中也存在名為arguments
的預設物件供內部呼叫,是一個類似 array 的物件,裡面存的就是帶進 function 的值:
1 | function sum(x,y){ // x, y 為 parameter |