【问题标题】:Javascript for loop yields wrong resultsJavascript for 循环产生错误的结果
【发布时间】:2013-09-13 13:01:08
【问题描述】:
for (var i in tokens) {
    var id = tokens[i].substring(0, tokens[i].indexOf('='));
    var name = tokens[i].substring(tokens[i].indexOf('=') + 1); 
    .                   
    .   
    .
    var button = document.createElement('button');
    button.id = id;
    $(button).addClass('friend-invite-button')
        .html('Invite')
        .click(function() {             
        $.ajax({ url: path + '/twitter/directmessage.php',
                     data: {'screen_name': name},
                     type: 'post',
                     success: function(output) { alert(output); }
                });
            }); 
}

上面的代码似乎将变量“name”的相同值附加到点击事件。每次单击按钮时,我都会在警报中得到相同的值,并且该值是我通过循环获得的最后一个值。你能纠正我吗?我的php文件在下面

<?php
session_start();
require_once('twitteroauth.php');
require_once('config.php');

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
$request_token = $connection->getRequestToken(OAUTH_CALLBACK);

$_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];

switch ($connection->http_code) {
  case 200:
    $options = array("screen_name" => $_POST["screen_name"], "text" => "message");
    $status = $connection->post('direct_messages/new', $options);
    echo $_POST["screen_name"];
    break;
  default:
    echo 'Could not connect to Twitter. Refresh the page or try again later.';
}

【问题讨论】:

  • 令牌= 1849157244 = 79papakon&18404957 = Kartesios&79528454 = ai_katerina&125322383 = TheKoulWay&275882593 = lawgreece&18627400 = nqtv&617386550 = epamhellas&544153184 = toxwni,在其余做.split( '&')循环前跨度>
  • 您的点击处理程序确实访问了在上次迭代期间处理的值并设置为相同的变量。请参阅Javascript closure inside loops - simple practical example 了解如何解决此问题。
  • 如果您要循环数组,请确保使用常规的 for 循环,而不是 for..in
  • 不知道这个“关闭”陷阱,非常感谢

标签: php javascript jquery for-loop


【解决方案1】:

这里的问题是,在循环的每次迭代中创建的函数将在函数被调用时在封闭范围内查找name 变量的值。这意味着这些函数中的每一个最终都将使用来自最终迭代的 name 的值。

考虑下面这个简单的例子,它说明了这里发生了什么:

var functions = [];
for (var i = 0; i < 3; i++) {
    functions.push(function() {
        console.log(i);
    });
}
functions[0]();  // logs 3

因此,即使乍一看,functions[0](); 应该记录 0,因为这是在创建 functions[0]i 的值,但它会记录 3,因为那是 i 的值当函数被调用时。

解决此问题的一种方法是使用闭包,在每次迭代中将变量固定为当前值:

function createClickHandler(path, name) {
    return function() {             
        $.ajax({ url: path + '/twitter/directmessage.php',
                 data: {'screen_name': name},
                 type: 'post',
                 success: function(output) { alert(output); }
                });
    };
};
for (var i in tokens) {
    .                   
    .   
    .
    $(button).addClass('friend-invite-button')
        .html('Invite')
        .click(createClickHandler(path, name)); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多