js context 上下文
有时候是这样的,译者在翻译书的的时候不知道拿什么来对应相应的英文,就根据自己的感觉,好像大概是这个意思来强加给广大读者,让很多人不知所以然。
@原磨豆浆 的大意是对的,上下文的原意是 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
, 以便后面可以引用。