簡體   English   中英

匿名函數中的變量未定義

[英]Variable Undefined in Anonymous Function

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 我出了什么問題?

因為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

你在這里做的是立即調用一個新函數,傳入參數服務器,並返回一個接收該值的新函數。

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”仍在函數范圍內。 無需將其作為參數傳遞。

快速修復

// ...

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傳遞的第一個參數, 根據文檔 ,它是什么都沒有 ,所以server現在是undefined

如果這是令人困惑的(我懷疑它是),我建議閱讀關於javascript閉包。 這是一個開始的好地方


有趣的事實 :通過在arguments內部使用Javascript的內置arguments數組對象,您可以按順序訪問參數,而無需任何顯式名稱:

var sum = function () {
    var i, total = 0;
    for(i = 0; i < arguments.length; ++i) {
        total = total + arguments[i];
    }
    return total ;
};

alert(sum(1,2,3)); // Displays "6"
alert(sum(1,2,3,4)); // Displays "10"
alert(sum(1,0,2,3)); // Displays "6"
alert(sum()); // Displays "0"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM