我无法绕过JSHINT抱怨将this
关键字用作possible strict violation
。
最初我有这个简单的原型模式,而我正在使用function declaration
。在这种情况下,JSHINT会抛出possible strict violation
(function (ns) {
'use strict';
ns.EventData = function (eventData) {
this.id = eventData.id;
this.name = eventData.name;
};
ns.EventData.prototype = (function () {
return {
getDate: getDate
};
// function declaration
function getDate() {
return ns.utils.formatDate(this.date);
};
}());
}(window.myProject));
然而,当我切换到function expression
时,一切正常。谁能解释为什么会有区别?
ns.EventData.prototype = (function () {
// function expression
var getDate = function () {
return ns.utils.formatDate(this.date);
};
return {
getDate: getDate
};
}());
答案 0 :(得分:1)
当您使用功能声明时,您可以将它放在任何您想要的位置。如果在声明函数之前调用函数并不重要,它将在内存中可用,并且不会出现错误。这就是解释JavaScript的方式。
表达式并非如此。表达式需要在被调用之前执行(它的表达式,所以它才有意义)。例如,可以执行此操作:
(function (ns) {
'use strict';
test();
function test() {
console.log('Test');
}
}(window.myProject));
但无法执行此操作:
(function (ns) {
'use strict';
test();
var test = function() {
console.log('Test');
}
}(window.myProject));
我认为这是两者之间的唯一区别。
Javascript解释器将查找并移动范围顶部的所有声明(在您的情况下为(function (ns) {...
)以及JSHint抱怨的原因。
结论,当JSHint看到你在函数声明中使用this
时它会警告你,因为解释器可能会将该函数移动到不同的上下文,你可能会有this
的不同值。
这只是一个警告,理论上可能会发生类似的事情,但在大多数情况下,您对命名空间和上下文非常肯定,所以请忽略它;)