js上下文

2019-06-21 04:32:06發布 來源:https://segmentfault.com/q/1010000003815144

有時候是這樣的,譯者在翻譯書的的時候不知道拿什么來對應相應的英文,就根據自己的感覺,好像大概是這個意思來強加給廣大讀者,讓很多人不知所以然。

@原磨豆漿 的大意是對的,上下文的原意是 context, 作用域的原意是scope, 這兩個不是一個東西。

每一個函數的調用(function invocation) 都有對應的scope 和context.

scope 指的是 函數被調用的時候, 各個變量的作用區域
context 指的是 current scope and its enclosing scope. 就是當前scope 和包裹它外面的scope. 如果一個變量在當前scope沒找到,那么它會自底向上繼續找enclosing scope 直到找到為止。很像javascript 的prototype那樣的找法。經常在javascript中,函數被調用的時候, 查看this 指向哪個object, 那么那個object 就是當前的 "上下文"。
圖片描述
還有就是要知道JavaScript中 函數被調用有四種方式:

  • The Method Invocation Pattern
  • The Function Invocation Pattern
  • The Constructor Invocation Pattern
  • The apply Invocation Pattern

為什么要區分這些,因為每一種中的this指向的對象是不同的。

以最后一個為例解釋一下context

// 一個函數, 自己執行的時候沒意義,因為它不知道 this 是誰
function foo() { this.saySomething('good') };

obj1 = { saySomething: function(x) { console.log('im from obj1' + x); } }

obj2 = { saySomething: function(x) { console.log('im from obj2' + x); } }

foo.call(obj1); // 把this 綁定給 obj1, context 就是 obj1
foo.call(obj2);// 把this 綁定給 obj2, context 就是  obj2

后面還有一些語言上的小坑比如 函數里面的函數(closure) 里 默認的 this指向的是global, 而不是當前的object。 所以你經常會看到 var that = this 或者 var self = this的 小技巧 這就是保存context, 以便后面可以引用。

上海二八杠单人操作