我想知道为什么结果是2?

 var value = 2
    var foo = {
      value: 1,
      bar: bar.bind(foo)
    }

    function bar() {
      console.log(this.value)
    }

    foo.bar() //2
阅读 3.5k
5 个回答

造成这种现象的原因是bar.bind(foo)在运行的时候foo还是undefined,所以foo.bar里的this指向了window

image.png

我们把 foo 换成 undefined 可以看到结果也是 2

然后我们开启严格模式,就会发现报错了,那么可以知道这里走的规则是什么了。

image.png


接下来说说执行顺序

  1. 提升

    var value;
    var foo;
    function bar() {
       console.log(this)
       console.log(this.value)
    }
  2. 当前的命令,我们重点看 foo 赋值的时候。
    考察你一下运算符的优先级,你说 foo = 1 + 1是先算 1+1 还是先算 foo = 1

    value = 2
    foo = {
       value: 1,
       bar: bar.bind(foo)
    }
    foo.bar()
    1. 当然是 = 赋值运算符的优先级更低了
      foo = 1 + 1 可以理解为 _foo = 1 + 1; foo = _foo,这里 _foo 可以理解为一个不存在的变量,用于存放结果。
      那么就不难理解了,foo未赋值的情况下,你访问了一下他,所以为undefined

额... 你可以先看看不同情况下this是谁 可以看看 你不知道的Javascript这本书 好像是3本 很薄的 里面有有解释 我觉得写的还可以 然后var 在浏览器使用的时候会声明到window上 这个也有很多博客讲 看明白就理解了

bar中的this指向了window,在输出上加一个log,一目了然
image.png

新手上路,请多包涵

谢谢大家的帮助,我想我应该明白了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题