【问题标题】:Jshint | Passing default settings | Function declarations and 'this'Jshint |通过默认设置 |函数声明和“this”
【发布时间】:2023-09-21 05:20:01
【问题描述】:
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 中的错误。它不想看到在循环中声明的函数。

但是,如果我传入一个简单的函数引用,那么我无法在不再次破坏 jshint 的情况下提取“this”。

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

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

我不担心错误(这是可选的,我可以将其关闭)...我只想知道是否可以通过默认值...是否有我错过的角度.

【问题讨论】:

    标签: javascript jshint


    【解决方案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 );
    }
    

    【讨论】:

    • @HiroProtagonist:您使用这些技术在自己的代码中遇到错误?
    • 你没有使用这个构造函数......但是你没有得到错误。
    • @HiroProtagonist:我只能假设它将其用作事件处理程序,并且知道在事件发生时将设置this 值。不知道为什么它会对您的代码产生影响。我不得不稍微修改一下代码,因为没有发布完整的示例,所以可能会有一些不同。
    • 我使用了您的第一个示例...不知道为什么它有效...但确实有效!...我想反复试验是关键...。再次感谢
    • snap!...您的第一个示例的工作原理是它通过了 jslint...但是该函数不会在事件中触发...它不会触发。
    【解决方案2】:

    您似乎想在回调中使用 this 作为上下文,但 jshint 抱怨在不是构造函数的函数中使用 this。

    假设这是你的代码

    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

    【讨论】:

    • @HiroProtagonist 不确定“必须给我一个函数构造函数”是什么意思 在循环内的函数中显示你的实际代码
    • 使用 'this' 并在 jshint 上传递默认设置....this 只能在这样的函数构造函数中使用.....var function_constructor = function(){ // 此处的代码};
    • @HiroProtagonist 看我的例子,你不必在你的函数中使用this,你使用我,这是一个指向原始this的闭包变量
    • @HiroProtagonist 我想我明白你的意思,你想使用调用函数的上下文,在这种情况下节点本身为this?
    • @HiroProtagonist 不一样,“am not i am”还在用this这个关键字,我是通过将节点传递给回调函数创建者来避免的