一个this的问题

看了tom大叔的深入浅出JavaScript,其中有一段关于this的有点搞不懂,他这样说:“当调用表达式限定了call括号左边的引用类型的值, 尽管this被设定为null,但结果被隐式转化成global。当引用类型值的base对象是被活动对象时,这种情况就会出现。” 然后给了下面这段例子:

 function foo() {
      console.log(this);//goo
      function bar() {
        console.log(this); // global
      }
      bar(); // the same as AO.bar()
    }
    var goo = {
        go:foo
    }
    goo.go();

根据我看了的理解在进入函数上下文时,这对象里面会有三个属性:1、变量对象(vo) 2、作用域链 3、this值,现在要说的就是this的值,里面说函数的this值是有调用者call给的,所以第一个log出goo没错,但在foo里面调用bar函数时为什么会是global,按照理解在执行bar()时会进入bar的上下文,而他的this值应该是调用者给的,而调用者foo的this值是goo,那为什么第二个log出来global。。。谁能解释一下这其中运作的过程!

阅读 2.5k
4 个回答

按照理解在执行bar()时会进入bar的上下文,而他的this值应该是调用者给的,而调用者foo的this值是goo

这句话不对,调用bar()的是foo函数,准确说就是你写的the same as AO.bar(),所以肯定不是goo。
然后文章后面不是说了:“活动对象总是作为this返回,值为null——(即伪代码的AO.bar()相当于null.bar())。这里我们再次回到上面描述的例子,this设置为全局对象”

任意一个不经过bind的函数直接调用this都是全局

我的理解是,foo函数在定义时就已经运行了bar函数,那么bar函数的运行域就是foo函数的定义域,而foo函数定义是在全局域上定义的,也就是说bar函数的运行域是global,所以this就是global。
不过理解不一定正确,等待大神详解!

应为bar()是一个函数调用,函数调用中函数this指向全局。

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