JSHINT 严格违反函数表达式与函数声明
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
值。
这只是一个警告,理论上可能会发生类似的事情,但在大多数情况下,您非常确定命名空间和上下文,因此请忽略它;)
相关文章:
- 直接在函数声明上使用function.prototype.bind
- 可以Resharper在我的javascript函数声明中添加分号
- 此行是否包含函数声明
- 函数声明与函数表达式之间的性能差异
- 为什么在javascript函数声明中使用逻辑运算符
- 函数声明未定义-原因
- JavaScript执行从函数声明开始,而不是从$(document).ready()开始
- 杰辛特 |传递默认设置 |函数声明和“this”
- 未知的 JavaScript 函数声明模式
- JavaScript 中的函数声明
- 在函数声明而不是运行时分析所有变量
- 命名函数声明有什么好处吗
- 将一个简单的函数声明形成JavaScript中的闭包
- 返回语句后的函数声明全局变量不会被覆盖
- (this)在函数声明之后
- 为什么使用 ||在变量函数声明中
- 为什么要将函数声明分配给命名变量
- 具有相同参数的 Javascript 函数声明
- 从性能的角度来看,函数声明与表达式
- 为什么 Mozilla Javascript 调试器的断点会捕捉到函数声明