this.name 与 name 的区别?
发布于 9 年前 作者 SPxiaomin 3963 次浏览 最后一次编辑是 8 年前 来自 问答

代码如下:

```js\n
var object = {
	getName: function () {
		return function () {
			return this.t;
		};
	}
};

console.log(object.getName()());      //undefined	
```
```js\n
var object = {
	getName: function () {
		return function () {
			return t;
		};
	}
};

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

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

5 回复

this 指针是一个对象,所以 this.name 是 undefined。后者 name 未声明,直接调用就会报错。

如果你是在浏览器里运行, 2. 是不会报错的, 因为未声明的全局变量会自动先去匹配window对象的属性. 而window对象上是有name属性的

@kiliwak 好吧!没有注意细节,我改了下问题,谢谢。

问题得到解决:

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

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

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

感谢你们!

这两种方式访问中,this都是全局对象,浏览器环境中就是window,第一种方式是访问window.t(即window对象的t属性),此时返回undefined,第二种方式直接访问t,此时t是未定义的,所以报ReferenceError。 js中不能直接访问未定义的变量,但可以访问某个对象的未定义属性(结果为undefined)

回到顶部