Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Javascript for循环产生错误的结果_Php_Javascript_Jquery_For Loop - Fatal编程技术网

Php Javascript for循环产生错误的结果

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); .

上面的代码似乎将变量“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); 
    .                   
    .   
    .
    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)); 
}