Javascript 为什么setTimeout(myFunction,0)可以工作,但运行函数本身却不能工作?

Javascript 为什么setTimeout(myFunction,0)可以工作,但运行函数本身却不能工作?,javascript,jquery,Javascript,Jquery,选择textarea时,此代码应选择textarea的内容。但是,它本身不起作用: $("#form").focus(function() { $("#form").select(); }); 只有当我给它一个setTimeout值为0时,它才起作用,如下所示: $("#form").focus(function() { setTimeout(function() {

选择textarea时,此代码应选择textarea的内容。但是,它本身不起作用:

        $("#form").focus(function() {
            $("#form").select();
        });
只有当我给它一个
setTimeout
值为0时,它才起作用,如下所示:

        $("#form").focus(function() {
            setTimeout(function() {
                $("#form").select();
            }, 0);
        });

为什么会这样?

看起来第一个代码段正在选择,然后取消选择文本。我怀疑文本选择是在
focus
事件完成后在幕后处理的,并且
setTimeout
在事件发生后执行
select
(当幕后工作已经发生时)。

处理此类事情时,请务必记住这一点:

浏览器是单线程的。这是一个简单的模型,但可以这样想:等待事件(击键、鼠标、触摸、计时器等),执行脚本,更新页面,一遍又一遍

当您
setTimeout(func,0)
所做的是告诉浏览器下一次迭代而不是本次迭代。因此,它将有时间解析表单标记。或者,如果处理的是宽度或高度,它可能有时间显示该项,从而计算其宽度或高度(而不是将其读取为0)


可能发生的情况是,通过聚焦textarea调用的事件级联中的某些内容最终也会取消选择其内容。通过将所选内容移动到下一次迭代,您可以将其从“焦点”、“全选”、“全选”更改为“焦点”、“全选”、“全选”。

为什么要在同一元素上运行
focus()
?我无法在脑海中计算JS,但这不是创建了一个无限循环吗?这个函数在文档中的位置是什么?文件里有吗。准备好了吗?@Blender,我纠正了那个错误@Ashray,这是在
if(window.$){}
块中加载的(以确保jquery已加载)。似乎没有其他js会干扰。它需要位于
$(document.ready(function(){…})中
block,而不是
if(window.$){…}
block。@Blender,如果我没有将它放入jquery就绪块,它会在jquery之前加载,我会得到一个错误(我在页面底部加载我的js)。为什么它不能正常工作?