javascript - 一个this的问题
高洛峰
高洛峰 2017-04-11 12:54:36
[JavaScript讨论组]

看了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。。。谁能解释一下这其中运作的过程!

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(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指向全局。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号