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.';
}
答案 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}}