javascript - this.name 与 name 访问全局变量的区别?
黄舟
黄舟 2017-04-10 15:54:43
[JavaScript讨论组]

代码如下:
1.

var object = {
    getName: function () {
        return function () {
            return this.name  //通过call方法设置了全局变量
        };
    }
};

console.log(object.getName()());      //undefined    

2.

var object = {
    getName: function () {
        return function () {
            return name
        };
    }
};

console.log(object.getName()());      //ReferenceError: name is not defined

问题来了,上面的两种方式,同是访问全局变量中的 name, 为什么得到的结果却不一样?

已解决:
github上有对这个问题的详细的解释:),谢谢各位

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(4)
ringa_lee

第一个返回的是值是window对象的一个未赋值的属性,这个undefined是种数据类型。

第二个是试图返回一个未定义的变量,这个根本不能称作全局变量。因为没有声明,解释器去内存中根本找不到name这个东西。

js中允许在声明变量的时候不使用var(实质上没有声明变量,只不过是对window的属性赋值),但是这不代表你可以使用一个未经声明的变量。

高洛峰

首先这个和闭包貌似没有关系吧?题主不妨把问题改为:console.log(this.foo) 和 console.log(foo)的区别。结果当然是和上面一样的。这个必须要解释的话就看@wenjoy,理解下就行。

我试了下this.foo === foo,前提是有值存在,这样是true。所以在有定义情况下,this.foofoo完全一样。
PS:还有如果是声明的话var foo = 2foo = 2或者this.foo = 2几乎一模一样,除了var声明的不能delete

伊谢尔伦

第一个尝试在windiw对象上找name属性,如果没有name属性的话是会给这个属性赋值undefined。第二个相当于查找name这个变量,查完整个作用域链都没有找到,则会报错。

巴扎黑

第一个不是访问全局变量中的 name

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

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