JSHINT 严格违反函数表达式 vs 函数声明
JSHINT strict violation function expression vs function declaration
我无法解决 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
};
}());
事情是当你使用函数声明时你可以把它放在任何你想要的地方。如果在声明之前调用函数并不重要,它将在内存中可用,并且不会出错。 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
值。
这只是一个警告,理论上可能会发生类似的事情,但在大多数情况下,您对您的名称空间和上下文非常确定,所以请忽略它 ;)
我无法解决 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
};
}());
事情是当你使用函数声明时你可以把它放在任何你想要的地方。如果在声明之前调用函数并不重要,它将在内存中可用,并且不会出错。 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
值。
这只是一个警告,理论上可能会发生类似的事情,但在大多数情况下,您对您的名称空间和上下文非常确定,所以请忽略它 ;)