Javascript这是未定义的。这应该是全球对象

时间:2014-01-30 03:21:16

标签: javascript

为什么在从网页加载脚本时在google dev控制台中出现以下错误?

但是,如果我使用开发工具调试器单步执行代码,则不会发生错误 this.name ='Jane Doe'如预期的那样?

的index.html

<script type="text/javascript" src="main.js"></script>

main.js

'use strict';
var name = 'Jane Doe',
    greet = function () {
        return 'My name is ' + this.name;
    };
console.log(greet());

控制台:

未捕获的TypeError:无法读取未定义的属性“名称”

2 个答案:

答案 0 :(得分:4)

this未在严格模式下绑定到全局对象。

{null}未定义时,this的值不会转换为全局对象。 的JavaScript

function testFunc() {
    return this;
}
var testvar = testFunc();

在非严格模式下,testvar的值是全局对象,但在严格模式下,该值是未定义的。

http://msdn.microsoft.com/en-us/library/br230269(v=vs.94).aspx

解决了大部分问题。我仍然无法解释为什么它在逐步执行chrome调试器中的代码时有效。

答案 1 :(得分:0)

因为你在这里滥用全局命名空间,这很糟糕。当没有其他范围时,this通常会分配给window。但是如果该函数正在处理,比如一个DOM事件,则this将是触发该事件的元素。长话短说,你通常不应该依赖this来设置某些东西。

使用call或apply显式设置它,在这里非常好地解释:What is the difference between call and apply?

或者保存一个特定的并将你的函数定义为它周围的闭包:

self = window;
self.name = 'Jane Doe';
self.greet = function () {
    return 'My name is ' + self.name;
};
console.log(self.greet());

那段代码让我觉得很脏。如果你绝对必须的话,只能破坏全局命名空间。例如,当您定义jQuery变量或ko变量(使用knockout)时。即便如此,也不要这样做:)

当然this完全可以使用,但在使用之前你应该真正理解它。这超出了这个问题的范围。