为什么在从网页加载脚本时在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:无法读取未定义的属性“名称”
答案 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
完全可以使用,但在使用之前你应该真正理解它。这超出了这个问题的范围。