for ( element = 0; element < this.tag_array.length; element++ ) {
document.getElementById( this.tag_array[element] ).addEventListener(
"click", function(){ /* constructor function here */ } ); // jshint.com error #1
}
此代码将在jshint.com b.c中导致错误。它不希望看到循环中声明的函数。
但是,如果我传入一个简单的函数引用,那么我就无法再次提取'this'而再次破坏jshint。
for ( element = 0; element < this.tag_array.length; element++ ) {
document.getElementById( this.tag_array[element] ).addEventListener(
"click", vFlipBP );
}
现在,当我在vFlipBP中使用'this'时,我收到错误b.c.它希望'this'与构造函数一起使用。
function vFlipBP(){ var foo = this ; } // jshint error #2
因此,我发现不可能让jsthint.com在这个特定的功能中感到高兴。
没关系,请关闭jshint.com选项。
是否可以编写通过jshint.com默认设置的代码。
我只是想了解它为什么会发出这些警告/错误的原因。
我不会担心这个错误(这是可选的,我可以把它关掉)...我只想知道是否可以通过默认...是否有一个我错过的角度
答案 0 :(得分:1)
看起来你想使用this
作为回调中的上下文,但是jshint抱怨在不是构造函数的函数中使用它。
假设这是你的代码
function showId() {
alert(this.id); // jshint warning here
}
for ( element = 0; element < this.tag_array.length; element++ ) {
document.getElementById( this.tag_array[element] ).addEventListener(
"click", showId );
}
你必须重写你的功能,所以它不使用this
,这是一种可能的方式
function createHandler(obj) {
return function(e) {
alert(obj.id);
}
}
for ( element = 0; element < this.tag_array.length; element++ ) {
var nodeId = this.tag_array[element];
var node = document.getElementById(nodeId);
node.addEventListener("click", createHandler(node));
}
难道你不能告诉jshint这个特定功能使用this
是否安全?使用validthis
这个选项?在Google Closure Compiler中,您可以使用@this
指定您知道该函数中的this
(并避免警告)https://developers.google.com/closure/compiler/docs/js-for-compiler
答案 1 :(得分:1)
由于您似乎并不关心制作几个相同的函数,似乎JSHint并不介意这一点......
var element;
for ( element = 0; element < 10; element++ ) {
document.getElementById( this.tag_array[element] ).addEventListener(
"click", make_func() );
}
function make_func() {
"use strict";
return function(){ var foo = this; alert(foo); };
}
如果你不使用函数声明语法,它似乎也接受了......
var element;
var the_func = function(){
"use strict";
var foo = this;
alert(foo);
};
for ( element = 0; element < 10; element++ ) {
document.getElementById( this.tag_array[element] ).addEventListener(
"click", the_func );
}