【问题标题】:Undefined jQuery value when trying to correct JSLint complaint: "Don't make functions within a loop"尝试纠正 JSLint 投诉时未定义的 jQuery 值:“不要在循环中创建函数”
【发布时间】:2011-04-16 21:28:38
【问题描述】:

在 jQuery ajax 函数中,成功时提供给回调函数的数据是用

定义的
success: function (data) { ...

但这让 JSLint 不开心(“不要在循环中创建函数”)。

如果我按照How to fix jslint error 'Don't make functions within a loop.'? 中的建议,Firebug 会抱怨“未定义数据”并且回调函数失败。

例子:

$(document).ready(function(){之前

function ajaxSuccess() {
   return function (data) {
      alert (data);
   };
}

$(document).ready(function(){

$.ajax({
    type: "POST",
    url: "some-url-here",
    data: ({ "foo" : "bar" }),
    success: ajaxSuccess(data)
});

导致“数据未定义”错误。

但是如果我把它改成

$.ajax({
    type: "POST",
    url: "some-url-here",
    data: ({ "foo" : "bar" }),
    success: function (data) {
        ajaxSuccess(data);
    }
});

那么一切都很糟糕——但现在我又回到了 JSLint 的起点。

假设我想通过 JSLint 的测试,我如何获取 url 返回的 data 并将其传递给相关函数?

【问题讨论】:

    标签: javascript jquery jslint


    【解决方案1】:

    success: 需要一个函数,但您不必为它创建一个。

       function ajaxSuccess(data) 
       { 
         alert (data); 
       }
     // :
     // :
    
    $.ajax({ 
        type: "POST", 
        url: "some-url-here", 
        data: ({ "foo" : "bar" }), 
        success: ajaxSuccess     // note: no parameters, just the name.
        } 
    });   
    

    最初,您说的是“创建一个新函数,它接受一个数据参数,并将其分配给success”。我的版本说“我已经有一个带有数据参数的函数(名为 ajaxSuccess)。将其分配给成功”。

    【讨论】:

    • 太棒了。谢谢,但是如果涉及另一个参数怎么办?我们依赖全局变量?
    • ajaxSuccess 可以有成功所需的参数。我只是以一个为例。
    • 灯泡闪烁。谢谢詹姆斯
    【解决方案2】:

    您需要从您的ajaxSuccess() 调用中删除data 参数,因为在您调用它时未定义data

    success: ajaxSuccess()
    

    或者你真的不需要让ajaxSuccess() 返回一个函数。

    function ajaxSuccess(data) {
        alert(data);
    }
    
    success: ajaxSuccess
    

    编辑:

    根据您的评论,您可以像以前一样调用ajaxSuccess(),并将您想要的任何参数传递给它,只要它们已定义。

    function ajaxSuccess( param ) {
       return function (data) {
          alert (param);
          alert (data);
       };
    }
    
    success: ajaxSuccess( "someParameter" )
    

    【讨论】:

      【解决方案3】:

      您永远不会在 ajaxSuccess 的定义中将数据作为参数。

      【讨论】:

        【解决方案4】:

        在处理 javascript 函数时,请始终考虑返回类型。此外,函数引用和函数结果之间存在差异。

        例子

        // uncalled
        var ajaxSuccess = function(){};     // typeof(ajaxSuccess) == 'function'
        //called
        var ajaxSuccess = function(){}();   // typeof(ajaxSuccess) == 'undefined'
        
        • 调用时,没有返回语句的函数返回未定义
        • 被调用的函数会立即运行(这就是它说数据未定义的原因)
        • 未调用函数的赋值是对该函数的引用(可以在稍后的时间点调用)
        • 被调用函数的赋值是该函数的返回语句

        【讨论】:

          猜你喜欢
          • 2013-03-17
          • 2011-10-15
          • 2014-08-17
          • 2011-03-03
          • 2014-11-15
          • 2011-10-29
          • 1970-01-01
          • 2015-06-17
          • 2012-09-17
          相关资源
          最近更新 更多