我收到了这个错误,不知道原因是什么。有什么想法吗?
第2127行的问题18:在变量'sport'中不好。 for(sport in sugested_sports)
// make array
var sugested_sports = data.split(",");
// pre build DIV
var sporty_items = '';
for (sport in sugested_sports)
{
if (sugested_sports.hasOwnProperty(sport)) {
sporty_items += '<a href="#'+identifier[1]+'">'+sugested_sports[sport]+'</a>';
}
}
// insert DIV
DIVsuggestions.html(sporty_items);
很多。
答案 0 :(得分:19)
尝试
var sport;
for (sport in sugested_sports)
这将处理缺少的变量声明并将其置于for循环之外(请参阅jsLint error "Cannot set property 'first' of undefined")。
答案 1 :(得分:17)
Pointy的答案可能是lint抱怨的答案。
作为一般规则,您在使用for (... in ...)
时应该小心。人们常常将此构造与C#中的foreach
或其他语言中的其他类似概念混淆,而实际上它与之无关。 javascript for in
构造迭代对象的每个成员 - 而不仅仅是集合中的值 - 包括方法和属性。如果您事先不知道它是如何工作的,这种行为通常会导致意外的副作用。
例如:
x = ['one', 'two'];
for (var value in x) {
alert(value);
}
这会产生两个警报,第一个是0
,第二个是1
,特别是集合的索引。
如果我们改变一点:
x = ['one', 'two'];
x.method = function() {};
for (var value in x) {
alert(value);
}
我们这次最终会收到三个提醒,0
,1
和method
。这是我所指的意外行为。如果你知道它的作用,可以使用in
,但我已经看到它不止一次地吸引人们。
以下两个例子都适用:
x = ['one', 'two'];
for (var i = 0; i < x.length; i++) {
alert(i);
}
答案 2 :(得分:3)
JSHint / JSLint中的所有错误意味着您没有声明您的键/迭代器变量。作为@Christopher suggests,JSLint希望您将其声明放在其范围的顶部(google JavaScript hoisting
了解有关提升的更多信息,like this link):
/*global data, identifier, DIVsuggestions */
// We'll pretend all of the above were passed in from a function's parameters
// by using JSLint's "global" keyword -- now you can paste this code into
// jslint.com and have it pass muster.
// make array
var sugested_sports = data.split(","),
sporty_items = '', // pre build DIV
sport; // <<<< **** DECLARE YOUR "KEY" HERE ****
for (sport in sugested_sports)
{
if (sugested_sports.hasOwnProperty(sport)) {
sporty_items += '<a href="#'+identifier[1]+'">'
+sugested_sports[sport]+'</a>';
}
}
// insert DIV
DIVsuggestions.html(sporty_items);
此处bad for in variable
此错误与其他地方的'sport' was used before it was defined
错误相同。
编辑:值得一提的是,如果您的for
位于内部函数中,则需要在同一上下文中声明for in
变量。如果您在父上下文中声明for in
,JSLint会抱怨。
示例:
function spam(d)
{
var fnTest, row; // `row` is defined "too early"
fnTest = function (data) {
for (row in data)
{
if (data.hasOwnProperty(row))
{
console.log(data.row);
}
}
};
fnTest(d);
}
为了让事情变得愉快,请将row
移到内部函数中。即使它在技术上仍然在范围内,JSLint也不喜欢之前使用过的“超级镜头”。
function spam(d)
{
var fnTest;
fnTest = function (data) {
var row; // and JSLint is happy! ;^D
for (row in data)
{
if (data.hasOwnProperty(row))
{
console.log(data.row);
}
}
};
fnTest(d);
}
<小时/> 顺便说一句,詹姆斯关注的是由OP插入的
hasOwnProperty
检查。取出那个检查,JSLint会抱怨,“for的主体应该包含在if语句中,以过滤原型中不需要的属性”。 Here's a little more on hasOwnProperty with for... in, if you're interested。
答案 3 :(得分:2)
var sugested_sports = data.split(","),
sport,
sport_items = '';
for (sport in sugested_sports)
{
//
}