JavaScript clearTimeout返回未定义的

JavaScript clearTimeout返回未定义的,javascript,jquery,ajax,settimeout,onkeyup,Javascript,Jquery,Ajax,Settimeout,Onkeyup,有人能解释一下我下面的代码有什么问题吗?我声明一个公共变量并将其设置为setTimeout,如果不是null,则在再次设置之前清除超时。当我试图清除超时时,我没有定义超时,因此超时将继续运行 var usernameCheckTimeout = null; $(document).ready(function(){ $("#username").on("keyup", function(e){ if($(this).val().length >= 6)

有人能解释一下我下面的代码有什么问题吗?我声明一个公共变量并将其设置为setTimeout,如果不是null,则在再次设置之前清除超时。当我试图清除超时时,我没有定义超时,因此超时将继续运行

var usernameCheckTimeout = null;

$(document).ready(function(){
    $("#username").on("keyup", function(e){ 
        if($(this).val().length >= 6)
        {
            if(usernameCheckTimeout != null)
            {
                clearTimeout(usernameCheckTimeout);
            }
            usernameCheckTimeout = setTimeout(isUsernameAvailable($(this).val()), 1000);
        }
    });
});

function isUsernameAvailable(username)
{
    $.ajax({
        url : "/account/username-check",
        method : "POST",
        dataType : 'json',
        data : {
            'username' : username
        }
    }).done(function(data) {
        console.log(data);
    });
};

正在清除超时。问题是您正在立即调用函数,而不是将函数传递给
setTimeout

setTimeout(isUsernameAvailable($(this).val()), 1000);
将调用isUsernameAvailable($(this).val()),此调用的结果将传递给
setTimeout

setTimeout(isUsernameAvailable($(this).val()), 1000);
您应该传递一个调用此函数的函数:

编辑:正如@Mark所说,您还需要处理
这个
不是您所期望的:

var value = $(this).val();

setTimeout(function(){
    isUsernameAvailable(value)
}, 1000);

正在清除超时。问题是您正在立即调用函数,而不是将函数传递给
setTimeout

setTimeout(isUsernameAvailable($(this).val()), 1000);
将调用isUsernameAvailable($(this).val())
,此调用的结果将传递给
setTimeout

setTimeout(isUsernameAvailable($(this).val()), 1000);
您应该传递一个调用此函数的函数:

编辑:正如@Mark所说,您还需要处理
这个
不是您所期望的:

var value = $(this).val();

setTimeout(function(){
    isUsernameAvailable(value)
}, 1000);

您不需要执行空检查,还需要围绕
创建一个闭包,否则
将不会引用您认为的
实际是什么

var usernameCheckTimeout;
$("#username").on("keyup", function (e) {
    if ($(this).val().length >= 6) {
        clearTimeout(usernameCheckTimeout);
        var that = this;
        usernameCheckTimeout = setTimeout(function () {
            isUsernameAvailable($(that).val();
        }, 1000);
    }
});

有些人喜欢像往常一样。

你不需要做空检查,你也需要在
这个
周围创建一个闭包,否则
这个
将不是你认为的
这个
实际上是什么

var usernameCheckTimeout;
$("#username").on("keyup", function (e) {
    if ($(this).val().length >= 6) {
        clearTimeout(usernameCheckTimeout);
        var that = this;
        usernameCheckTimeout = setTimeout(function () {
            isUsernameAvailable($(that).val();
        }, 1000);
    }
});

有些人像往常一样爱你。

你有几个问题。第一个问题非常严重,即您正在立即执行
isUsernameAvailable($(this).val())
,并将返回值传递给
setTimeout
-您需要将其移动到匿名函数中,以便在超时调用匿名函数之前不会执行:

usernameCheckTimeout = setTimeout(function () {
    isUsernameAvailable($(this).val());
}, 1000);
javascript超时函数依赖于数字ID来运行。您应该避免测试
null
未定义
或任何其他内容,而是测试一个数字:

// leave it as undefined
var usernameCheckTimeout;

...

if (typeof usernameCheckTimeout === 'number') {
    clearTimeout(usernameCheckTimeout);
}

你有几个问题。第一个问题非常严重,即您正在立即执行
isUsernameAvailable($(this).val())
,并将返回值传递给
setTimeout
-您需要将其移动到匿名函数中,以便在超时调用匿名函数之前不会执行:

usernameCheckTimeout = setTimeout(function () {
    isUsernameAvailable($(this).val());
}, 1000);
javascript超时函数依赖于数字ID来运行。您应该避免测试
null
未定义
或任何其他内容,而是测试一个数字:

// leave it as undefined
var usernameCheckTimeout;

...

if (typeof usernameCheckTimeout === 'number') {
    clearTimeout(usernameCheckTimeout);
}

谢谢你。回答正确,但只比@James Montagney晚几分钟。回答正确,但只比@James Montagne晚几分钟