Jshint |传递默认设置|函数声明和'this'

时间:2012-08-14 22:25:42

标签: javascript jshint

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默认设置的代码。

我只是想了解它为什么会发出这些警告/错误的原因。

我不会担心这个错误(这是可选的,我可以把它关掉)...我只想知道是否可以通过默认...是否有一个我错过的角度

2 个答案:

答案 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 );
}