0
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); }
                });
            }); 
}

上面的代码似乎将相同的变量“名称”值附加到点击事件。每次单击按钮时,我都会在警报中得到相同的值,并且该值是我通过循环获得的最后一个值。你能纠正我吗?我的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.';
}
4

1 回答 1

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,因为这是创建时间的值ifunctions[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)); 
}
于 2013-09-09T23:23:16.187 回答