Javascript JSHINT严格冲突函数表达式与函数声明
我很难绕过JSHINT,抱怨使用Javascript JSHINT严格冲突函数表达式与函数声明,javascript,gulp,jshint,Javascript,Gulp,Jshint,我很难绕过JSHINT,抱怨使用this关键字作为可能的严格违规行为 最初我有这个简单的原型模式,我使用的是函数声明。在这种情况下,JSHINT抛出可能的严格违规 (function (ns) { 'use strict'; ns.EventData = function (eventData) { this.id = eventData.id; this.name = eventData.name; }; ns
this
关键字作为可能的严格违规行为
最初我有这个简单的原型模式,我使用的是函数声明
。在这种情况下,JSHINT抛出可能的严格违规
(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));
然而,当我切换到函数表达式
时,一切正常。有人能解释为什么会有不同吗
ns.EventData.prototype = (function () {
// function expression
var getDate = function () {
return ns.utils.formatDate(this.date);
};
return {
getDate: getDate
};
}());
问题是,当您使用函数声明时,您可以将它放在任何您想要的地方。无论在声明函数之前是否调用它,它都将在内存中可用,并且不会出现错误。这就是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));
但是你不能这样做:
(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看到您在函数声明中使用此
时,它将警告您,因为解释器可能会将该函数移动到不同的上下文中,并且您可能对此
具有不同的值
这只是一个警告,从理论上讲,类似的事情可能会发生,但在大多数情况下,您对自己的名称空间和上下文非常确定,所以忽略它;)这可能对您有所帮助。事实上,有一个答案指向我为解决这个问题而遇到的相同解决方案,但不清楚是什么造成了如此大的差异,这就是我的问题。