JSHINT 严格违反函数表达式 vs 函数声明
Posted
技术标签:
【中文标题】JSHINT 严格违反函数表达式 vs 函数声明【英文标题】:JSHINT strict violation function expression vs function declaration 【发布时间】:2016-06-18 02:06:33 【问题描述】:我无法绕过 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
;
());
【问题讨论】:
这可能对你有帮助***.com/questions/7688765/… 不是真的,有一个答案指向我遇到的解决问题的相同解决方案,但不清楚是什么造成了如此不同,这是我的问题。 【参考方案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
有不同的值。
这只是一个警告,理论上可能会发生类似的事情,但在大多数情况下,您对命名空间和上下文非常确定,因此请忽略它;)
【讨论】:
以上是关于JSHINT 严格违反函数表达式 vs 函数声明的主要内容,如果未能解决你的问题,请参考以下文章