如何理解《你不知道的javascript》中的调用位置?

书中有句话是这样说的:

我们排除了一些对于 this 对错误理解并且明白了每个函数的 this 是在调用时被绑定的,完全取决于函数的调用位置。

然后举了例子

function baz(){ // 调用位置是全局作用域,调用栈 baz
  console.log('baz');
  bar(); // bar 的调用位置
}
function bar(){ // 调用位置在 baz 中,调用栈 baz -> bar
  console.log('bar');
  foo(); // foo 的调用位置
}
function foo(){ // 调用位置在 bar 中,调用栈 baz -> bar -> foo
  console.log('foo');
}
baz(); // baz 的调用位置

以上的例子虽然能够说明调用栈直接的关系,但是我不能明白,为什么说调用位置是this的决定性因素。

this的指向不是取决于,调用的绑定方式吗? 不管调用位置在哪里,你的调用方式一成不变,它的this 依然会执行默认绑定。

所以为什么说调用位置是this的决定性因素???

阅读 2.1k
2 个回答

其实他在后面有说:

go locate where a function is called from

其实就是在说需要定位到函数被调用的位置,重点是找到函数被谁调用。


最后的最后夹带一些私货,就是《你不知道的JavaScript》在基础不扎实的时候不要看,不然很容被里面的一些细枝末节的内容给带偏了路线,然后开始钻牛角尖,这是在浪费时间。所以我一直把这本书归于旁门左道。

另外一个就是最好可以对照着原版来看,因为在翻译的过程中会丢失一部分信息(私货2,反译得很差劲),所以在这种让你觉得困惑得时候直接看原版会好理解很多。
这里是原文地址 You-Dont-Know-JS/ch2.md at 1st-ed · getify/You-Dont-Know-JS

  1. 函数绑定是手动的,默认指向调用位置
  2. js 里函数是对象,所以存在以下代码
function foo() {
  console.log(this.name);
}
const a = {name: 'bar'};
a.b = foo;
a.b(); // 'bar'
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题