最近研究JS的ES6,對JS這個奇葩又有了新的感悟,但是由于之前很多地方理解不夠深,在回憶時一些JS特性有一些模糊,所以準備換個方式記錄自己的一些學(xué)習(xí)思考.
[胡侃]=講故事
我站在濃霧之中,隱約見到了一個模糊的背影,那個背影仗劍輕舞,靈動而飄忽.招式時而笨拙樸素,時而又高深讓人捉摸不透.細細品味,卻驚愕,這每一招看似普通,卻暗含精妙,只有反復(fù)琢磨才會發(fā)現(xiàn)其中的精髓.忽然那人一閃而過,消失在了我迷糊的夢境中. 空留我一人深深的沉浸在剛剛的夢幻般的劍舞之中.
一陣急促的鬧鈴,我驚醒,原來是一場夢,側(cè)頭發(fā)現(xiàn),一本《javascript編程精粹》正翻開躺在我枕邊...
今天需要介紹下我們的主人公隔壁老王,他長這樣(我畫畫比較丑大家將就看)
var wang = {
bed : "wang's bed",
repairBed: function() {
if (this.bed) {
console.log("fix");
console.log(this.bed);
}
}
}
由上圖可以看出,老王會干一件事情就是修床,而且技術(shù)很6.(別問我為啥是修床,我也不清楚原因,可能是因為床總壞)
// 老王修床
wang.repairBed()
// [output] fix
// [output] wang's bed
那么問題來了,這里出現(xiàn)了兩個玩意,第一個是"this",第二個是"bed".
第二個bed好理解,就是修的那個床唄.核心就是第一個"this",this的意思就是"現(xiàn)在在哪里"≈"where you are now". 所以this.bed就是特定地方的床.
默認老王肯定是在自己家的,所以this = 老王的家,于是this.bed就是老王家的bed.
然后有一天,隔壁來了一對夫妻,簡稱x,他們可能也被奸商騙了或者其他不可描述的原因,家里bed也總壞.突然一天他們知道了隔壁wang擅長修bed,所以就請wang出山幫忙.
x長這樣
var x = {
bed : "x's bed",
}
于是乎就發(fā)生了這么一件事情
wang.repairBed.call(x)
// 于是就
// [output] fix
// [output] x's bed
wang.repairBed.call(x)這個內(nèi)涵很豐富.首先干活的人是wang,讓他干的活是repairBed(也就他能干這個,別人也不會).所以就有了"wang.repairBed"這么一部分,但是能是x請wang出山的,而且是去x家修bed.所以"call(x)"的意思就是"被喊去(別管被誰)了x家修",這里的x主要關(guān)心的是x家,并不是關(guān)心x這人,比較wang還是比較敬業(yè)的,他是去修bed的不管是誰請他,也不care是誰的床.(真是個熱心的隔壁老王啊)
x這對couple情商很高,他不僅僅會用call這種方法調(diào)動wang,由于bed總需要repair,他們還換了種說法去請wang
wang.repairBed.apply(x)
"apply"和"call"是一樣的,就是讓wang去第一個參數(shù)所示的地方去修那里的bed, 區(qū)別是apply會將wang要帶的工具放進一個工具箱,而call則一個一個的列出來.
wang.repairBed = function (tool1, tool2) {
// 修床需要用tool1& tool2
console.log(tool1);
console.log(tool2);
if (this.bed) {
console.log("fix");
console.log(this.bed);
}
}
wang.repairBed.apply(x, ["hammer", "saw"]);
//apply喊老王 帶去的是工具箱 []
//工具箱里放的是各種tool
wang.repairBed.call(x, "hammer", "saw");
//call喊wang 帶去的是一個一個的散裝tool
//后面列出了各種tool
至此,wang拖著疲憊的身體回到了家中,夜里獨自翻看起了一本《javascript編程精粹》然后看著看著靠在床上睡著了,書從手中滑落到了枕邊...