匿名函数中的变量未定义

时间:2011-10-05 19:08:52

标签: javascript jquery

function updateServerList() {
    var i;

    for (i=0; i < servers.length; i++) {
     var server = servers[i];
     var ip = server['serverIp']


     var html = constructServer(i);
     var divId = '#server' + ip.replace(new RegExp("\\.", "mg"), "-");
     var visible = $(divId).find(".server_body").is(":visible");
     var div = $(divId);
     div.html(html);

     // Set div class.
     var prevState = div.attr('class').substring(7)
     if (prevState != server['state']) {

         if (server['state'] == 'ok') {
         console.debug(server);
         div.slideUp('fast', function(server) {
             $(this).removeClass();
             $(this).addClass('server_ok');
             var id = ipToId[server['serverIp']];
             console.debug(id);
             if (id == 0) {
             adjacentIp = servers[1]['serverIp'];
             adjacentDivId = '#server' + adjacentIp.replace(new RegExp('\\.', 'g'), '-');
             $(adjacentDivId).before(this);
             }
        }).delay(1000);
        div.slideDown();
        }
    }
}

console.debug显示server已定义,但在匿名函数中,server未定义。我出了什么问题?

3 个答案:

答案 0 :(得分:5)

因为server是函数的参数,它掩盖了更高级别server的值。您需要将服务器传递给函数,或者删除函数参数。我会做后者,因为slideUp没有给你一个传递参数的方法。你可以做到,但它不必要地复杂化;它看起来像下面的

div.slideUp('fast', (function(server) { 
   return function(){ 
      // your stuff here, server is now 'closed in', i.e. in a closure
   }
})(server)); // <-- this server is the current value in the loop

你在这里做的是立即调用一个新函数,传入参数服务器,并返回一个接收该值的新函数。

答案 1 :(得分:1)

var server = servers[i];

var prevState = div.attr('class').substring(7);

if (prevState != server['state']) {

   if (server['state'] == 'ok') {
      console.debug(server);
      div.slideUp('fast', function() {
            ...
         var id = ipToId[server['serverIp']];
     }
}

在您的匿名函数中,“server”仍在函数范围内。无需将其作为参数传递。

答案 2 :(得分:1)

快速修复

// ...

div.slideUp('fast', function() { // `server` argument removed
    // ...
});

解释

无需将server传递给该函数。匿名函数“关闭”server变量。


这只是一个函数声明

function (server) {...}

你还没有向该函数传递任何内容,因为它尚未被调用(server)位 在函数声明中,只需让您为函数命名参数。只有当您调用时,您才能传递参数:

var name = "Jill";
var showName = function (name) {
    alert(name);
};

showName("Jack"); // alert box shows "Jack"
showName(); // alert box shows "undefined"

因此,当您声明匿名函数的第一个参数的名称是server时,会发生名称冲突,导致无法访问原始函数;匿名函数中的serverslideUp传递的第一个参数,according to the documentation nothing ,所以server现在是{ {1}}。

如果这令人困惑(我怀疑它是),我建议阅读有关javascript闭包的内容。 Here's a good place to get started


有趣的事实:通过在函数中使用Javascript内置的undefined数组对象,您可以按顺序访问参数,而无需任何明确的名称:

arguments