javascript - this.name 与 name 访问全局变量的区别?
黄舟
黄舟 2017-04-10 15:54:43
0
4
400

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

黄舟
黄舟

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

reply all (4)
左手右手慢动作

第一个返回的是值是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

          Latest Downloads
          More>
          Web Effects
          Website Source Code
          Website Materials
          Front End Template
          About us Disclaimer Sitemap
          php.cn:Public welfare online PHP training,Help PHP learners grow quickly!