![](/img/trans.png)
[英]Strict violation when using 'this' in declared function, no violation with function expression
[英]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
具有不同的價值。
這只是一個警告,理論上可能會發生類似的事情,但是在大多數情況下,您對名稱空間和上下文非常有把握,因此請忽略它;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.