Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.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
Javascript for语句始终显示未定义的_Javascript - Fatal编程技术网

Javascript for语句始终显示未定义的

Javascript for语句始终显示未定义的,javascript,Javascript,所以我制作这个cracker/bruteforce只是为了在这里学习/测试nuthin是非法的,因为我是通过localhost和我自己的php登录来做的 所以我总是失败:未定义:未定义 假设失败时:user:pass 有什么帮助吗 谢谢 <script> function crack() { var cracked_area = document.getElementById("cracked_acc"); var failed_area = document.g

所以我制作这个cracker/bruteforce只是为了在这里学习/测试nuthin是非法的,因为我是通过localhost和我自己的php登录来做的

所以我总是失败:未定义:未定义

假设失败时:user:pass

有什么帮助吗

谢谢

<script>

function crack() {

    var cracked_area = document.getElementById("cracked_acc");
    var failed_area = document.getElementById("failed_acc");

    var num_users = 0;
    var num_cracked = 0;

    var html_next;

    var user_l = document.getElementById("users");
    var pass_l = document.getElementById("pass");

    if (user_l.value == "") {
        alert("The username field cant be empty!")
    } else if (pass_l.value == "") {
        alert("The password field cant be empty!")
    }

    var message = document.getElementById('message');

    var user_l_s = user_l.value.split("\n");
    var pass_l_s = pass_l.value.split("\n");


    for (var i = 0; i < user_l_s.length; i++) {
        num_users++;
        for (var j = 0; j < pass_l_s.length; j++) {
            $.ajax({
                url: 'php/postdata.php',
                type: 'GET',
                data: {'user': user_l_s[i], 'pass': pass_l_s[j]},
                dataType: 'text',

                success: function (response) {
                    html_next = response;

                    if (html_next.indexOf("Failed") > -1) {
                        failed_area.value += 'Failed:' + user_l_s[i] + ':' + pass_l_s[j] + '\n';
                    } else if (html_next.indexOf("Cracked") > -1) {
                        num_cracked++;
                        cracked_area.value += 'Cracked:' + user_l_s[i] + ':' + pass_l_s[j] + '\n';
                    }

                },
                beforeSend: function () {
                    message.innerHTML = "Loading results...";
                }
            });
        }
        message.innerHTML = "Total Accounts Cracked:" + num_cracked + "/" + num_users;
    }
}
在成功回调中,您引用变量i。 但是想想当for循环运行时会发生什么。调用回调时循环已经完成,这就是为什么i等于pass_l_s.length,因此user_l_s[i]未定义。 当你想在回调中使用变量i时,你必须用一个局部变量i创建你自己的小世界

我们在这里定义了一个自调用函数,它需要参数i。当for循环now每次通过all i循环时,自调用函数返回一个新函数,该函数现在可以访问i,从而使其本地定义为自调用函数的参数

很高兴知道
Javascript1.7引入了一个新的关键字let,它正是为了达到这个目的。但是现在它在生产中不可用,这是因为在循环中调用ajax函数。它是在loop语句中进行的异步调用,当响应返回到客户机时,循环已经结束,因此用户将没有定义。更改响应格式以返回登录失败的用户。

感谢您提供的信息和回答标记为答案的完美答案。
success: (function(i){

    return function (response) {
        html_next = response;

        if (html_next.indexOf("Failed") > -1) {
            failed_area.value += 'Failed:' + user_l_s[i] + ':' + pass_l_s[j] + '\n';
        } else if (html_next.indexOf("Cracked") > -1) {
            num_cracked++;
            cracked_area.value += 'Cracked:' + user_l_s[i] + ':' + pass_l_s[j] + '\n';
        }
    }
})(i)