Php Javascript for循环产生错误的结果
上面的代码似乎将变量“name”的相同值附加到click事件。每次单击按钮时,我都会在警报中得到相同的值,该值是我通过循环得到的最后一个值。你能纠正我吗?下面是我的php文件Php Javascript for循环产生错误的结果,php,javascript,jquery,for-loop,Php,Javascript,Jquery,For Loop,上面的代码似乎将变量“name”的相同值附加到click事件。每次单击按钮时,我都会在警报中得到相同的值,该值是我通过循环得到的最后一个值。你能纠正我吗?下面是我的php文件 for (var i in tokens) { var id = tokens[i].substring(0, tokens[i].indexOf('=')); var name = tokens[i].substring(tokens[i].indexOf('=') + 1); .
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
变量的值。这意味着这些函数中的每一个最终都将使用来自最终迭代的name
值
考虑以下简单示例,该示例说明了此处发生的情况:
<?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.';
}
tokens=1849157244=79papakon&18404957=Kartesios&79528454=ai_katerina&125322383=TheKoulWay&275882593=lawgreece&18627400=nqtv&617386550=epamhellas&544153184=toxwni,我在循环之前对其执行拆分(“&”),单击处理程序确实访问上一次迭代期间处理的值并设置为相同的变量。请参阅如何解决此问题。如果要循环数组,请确保使用常规的for
循环,而不是for..in
不知道此“闭包”陷阱,非常感谢
var functions = [];
for (var i = 0; i < 3; i++) {
functions.push(function() {
console.log(i);
});
}
functions[0](); // logs 3
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));
}