Javascript for循环产生错误的结果

时间:2013-09-09 23:05:28

标签: php javascript jquery for-loop

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'的相同值附加到click事件。每次我点击一个按钮,我在警报中得到相同的值,并且该值是循环获得的最后一个值。你能纠正我吗?我的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.';
}

1 个答案:

答案 0 :(得分: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也应该记录i,因为functions[0]创建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)); } 的值。

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

{{1}}