首页 > this.name 与 name 访问全局变量的区别?

this.name 与 name 访问全局变量的区别?

代码如下:
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上有对这个问题的详细的解释:),谢谢各位


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

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

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


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


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


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

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

【热门文章】
【热门文章】