代码如下:
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的属性赋值),但是这不代表你可以使用一个未经声明的变量。
首先这个和闭包貌似没有关系吧?题主不妨把问题改为:
console.log(this.foo) 和 console.log(foo)的区别
。结果当然是和上面一样的。这个必须要解释的话就看@wenjoy,理解下就行。我试了下
this.foo === foo
,前提是有值存在,这样是true
。所以在有定义情况下,this.foo
与foo
完全一样。PS:还有如果是声明的话
var foo = 2
和foo = 2
或者this.foo = 2
几乎一模一样,除了var
声明的不能delete
。第一个尝试在windiw对象上找name属性,如果没有name属性的话是会给这个属性赋值undefined。第二个相当于查找name这个变量,查完整个作用域链都没有找到,则会报错。
第一个不是访问全局变量中的 name