我认为问题在于您在方法内未使用
this
。以下是代码:
var myObj = {
myNethod: function displayMegaDropDown() {
"use strict";
var ts = jQuery(this),
liMegaPosition = ts.position(),
divMegaOffset = {
top: liMegaPosition.top + ts.height(),
left: liMegaPosition.left
};
ts.find("div").offset(divMegaOffset);
ts.addClass("hovering");
}
};
或者这一个
function displayMegaDropDown(t) {
"use strict";
var ts = jQuery(t),
liMegaPosition = ts.position(),
divMegaOffset = {
top: liMegaPosition.top + ts.height(),
left: liMegaPosition.left
};
ts.find("div").offset(divMegaOffset);
ts.addClass("hovering");
}
将不会给你任何错误或警告。
更新:另外一个版本非常接近你的原始版本,也没有错误或警告:
var displayMegaDropDown = function () {
"use strict";
var ts = jQuery(this),
liMegaPosition = ts.position(),
divMegaOffset = {
top: liMegaPosition.top + ts.height(),
left: liMegaPosition.left
};
ts.find("div").offset(divMegaOffset);
ts.addClass("hovering");
};
更新2:我认为这个问题很有趣,值得深入了解。所以我查看了
ECMAScript标准。我在“附录C(信息性)ECMAScript的严格模式”中找到了以下内容(在HTML版本
这里查看更好):
如果在严格模式的代码中评估this,那么this值不会被强制转换为对象。 null或undefined的this值不会转换为全局对象,原始值也不会转换为包装对象。通过函数调用传递的this值(包括使用Function.prototype.apply和Function.prototype.call进行的调用)不会将传递的此值强制转换为对象(10.4.3、11.1.1、15.3.4.3、15.3.4.4)。
我想这就是JSLint错误的原因。
当然,如果您关闭严格模式,代码将不再有错误:
function displayMegaDropDown() {
var ts = jQuery(this),
liMegaPosition = ts.position(),
divMegaOffset = {
top: liMegaPosition.top + ts.height(),
left: liMegaPosition.left
};
ts.find("div").offset(divMegaOffset);
ts.addClass("hovering");
}
更新 3: 看起来许多人怀疑在函数声明中无法使用this
,而在函数表达式中可以使用this
。今天我收到了关于这一点的另一个评论。因此,我创建了一个非常简单的演示。
(function () {
'use strict';
function test() {
alert(this);
}
test();
}());
您可以在这里进行测试,IE9中的演示会显示带有文本“[object Window]”的警报,而在当前版本的Chrome和Firefox上,您将看到“未定义”。
因此,在函数语句中使用this
存在问题,并不是“jslint的事情”。这是一个真正的问题,在JavaScript程序开发过程中应该考虑到它。
我个人更喜欢使用函数表达式,几乎从不使用更多的函数语句。我认为那些来自其他编程语言的人(像我一样)在开始时尝试使用在自己喜欢的语言中好用的相同结构。只有后来人们才发现,在块级别不存在作用域的情况下定义变量是不好的,而且函数语句也并不总是最好的选择。