計算機世界最聰明的地方就在於它是人為的,最愚蠢的地方也正在於此。
——我瞎寫的
已經有太多學習前端的人困於這個無聊的概念了。JavaScript 本就是脫胎於 Java 和 C 的語言,所以這個概念大概只能從 Java 得出。由於 Java 是純粹的面嚮物件語言,this
用來指代當前的類例項。而 JavaScript 先天缺乏 OO 的概念,所以可以說this
被異化了。因為 JavaScript 是一等函式,函式本身就是和類同樣的存在,這樣一來其外部呼叫環境是完全不確定的。所以這將得到規範裡的一條約定:
The this keyword evaluates to the value of the ThisBinding of the current execution context.
這說明this
繫結的是上下文(而不是作用域,因為上下文是動態的)。我之前看到了別人的文章從規範的角度去看這個問題:
github.com/mqyqingfeng…
但總覺得差點意思。畢竟規範是設計的結果,而不是設計的過程。所幸阮一峰老師在去年剛寫了一篇文章來從我更欣賞的角度分析這個問題:
www.ruanyifeng.com/blog/2018/0…
他指出了一個關鍵是,一等函式相當於直接指向記憶體的函式指標。這可以解釋另一個例子:
var value = 1;
var foo = {
value: 2,
bar: function () {
return this.value;
}
}
console.log((false || foo.bar)()); // 1
複製程式碼
此時 foo.bar 其實已經被計算(evaluate)了,所以相當於直接於呼叫一等函式。
PS:這裡一等函式是為了說明那些函式可以單獨執行而不需要從類進行訪問。