2010-07-25 45 views
0

我明白为什么JSLint在这里启动了一个警告,但我不知道如何编写我的代码以便验证。使用JSLint验证removeEventListener

这是一个煮沸的样品。在下面的代码中,我有一个对象,我需要附加两个事件监听器:一个用于“完整”,另一个用于“错误”。每个指向它自己的事件处理程序。当任何一个事件处理程序到达时,我想删除这两个事件处理程序。但是当我试图从第一个事件处理程序中删除第二个事件处理程序的侦听器时,我总是会得到一个验证错误。

var myFunction = function(obj) { 
    var doComplete = function() { 
     // ...Do something here to handle successful execution, then remove listeners 
     obj.removeEventListener('complete',doComplete,true); 
     obj.removeEventListener('error',handleError,true); // INVALID! 
    }; 
    var handleError = function() { 
     // ...Do some error handling here and then remove event listener 
     obj.removeEventListener('complete',doComplete,true); 
     obj.removeEventListener('error',handleError,true); 
    }; 

    obj.addEventListener('complete',doComplete,true); 
    obj.addEventListener('error',handleError,true); 
    obj.load(); 
}; 

每当我得到这些警告之一,它总是意味着我做错了什么,但在这种情况下,我看不出如何解决这个问题。有谁知道这样做的正确方法是什么?

验证错误是: Lint at line 5 character 41: 'handleError' is not defined.(Web客户端说:Implied global: handleError 5

+0

JSLint不允许您在引用它之前不使用变量。只需将“handleError”添加到预定义的变量列表中,或者忽略“error”(因为它有效) – tcooc 2010-07-25 14:23:12

+0

准确无误。但我通常只使用'/ * global XYZ:true * /'来表示真正全局的东西(比如'console')或我在其他文件中创建的东西,验证器不可能知道 - 但从来没有对于我正在验证的文件中的任何内容。 – Andrew 2010-07-25 14:37:00

+0

将JSLint中的'onevar'选项与Dominic的答案结合使用。 – user123444555621 2010-07-25 22:33:21

回答

1

您需要重新安排你的代码略有

var myFunction = function(obj) { 
    var doComplete, handleError; 
    doComplete = function() { 
     // ...Do something here to handle successful execution, then remove listeners 
     obj.removeEventListener('complete',doComplete,true); 
     obj.removeEventListener('error',handleError,true); // INVALID! 
    }; 
    handleError = function() { 
     // ...Do some error handling here and then remove event listener 
     obj.removeEventListener('complete',doComplete,true); 
     obj.removeEventListener('error',handleError,true); 
    }; 

    obj.addEventListener('complete',doComplete,true); 
    obj.addEventListener('error',handleError,true); 
    obj.load(); 
}; 

JSLint希望在使用变量之前看到变量声明。这种变化确实如此,尽管它出现无效。

+0

啊。当然。我不喜欢这么多,因为在函数声明之前使用'var'可以帮助我立即识别私有方法和发现范围问题。现在我可能不得不在方法前添加类似'/ * var * /'的东西。但肯定你的答案有效。 – Andrew 2010-07-26 01:44:02