问答

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

作者:admin 2021-09-13 我要评论

var value = 2 var foo = { value: 1, bar: bar.bind(foo) } function bar() { console.log(this.value) } foo.bar() //2 ### 造成这种现象的原因是 bar.bind(fo...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
 var value = 2
    var foo = {
      value: 1,
      bar: bar.bind(foo)
    }

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

    foo.bar() //2
###

造成这种现象的原因是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

###

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

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 我想知道为什么结果是2?

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

  • react 散点图组件

    react 散点图组件

  • 接口测试问题,node写的后端接口,启动

    接口测试问题,node写的后端接口,启动

  • vue 多入口页面 通用js如何获取当前是

    vue 多入口页面 通用js如何获取当前是

腾讯云代理商
海外云服务器