Javascript setTimeout()和窗口函数

Javascript setTimeout()和窗口函数,javascript,google-chrome,resize,settimeout,Javascript,Google Chrome,Resize,Settimeout,以下JavaScript代码在chrome中运行,并导致背景窗口的大小调整为my规范: var background; function play () { var w = screen.width; var h = screen.height; if( !background || background.closed ) background = window.open("background.html", "It's a pop-up!", "top="+ 100

以下JavaScript代码在chrome中运行,并导致背景窗口的大小调整为my规范:

var background;
function play () {
    var w  = screen.width;
    var h  = screen.height;
    if( !background || background.closed ) background = window.open("background.html", "It's a pop-up!", "top="+ 100 +",left="+ 770 +",width="+ w/3 +",height="+ h/3 +",location=no,menubar=no,scrollbars=no,status=no,toolbar=no,resizable=no");
    background.resizeTo(w,724);
}

但是,当我尝试延迟调整大小功能时,代码中断。为什么调用setTimeoutbackground.resizeTow,72410000没有可见的结果?

因为整个语句基本上都是eval'd,w不再有任何意义

试试这个:

setTimeout('background.resizeTo('+w+',724',10000);
换成

setTimeout(function(){background.resizeTo(w,724);},10000);
你应该传递一个函数。这是正确的解决方案,在使用setTimeout或setInterval时,永远不要依赖于将字符串作为“函数”传递,这样会比较慢,因为必须对其进行求值,而这是不对的

此外,您可能会遇到与示例中的范围类似的问题。您的代码只有在background和w都是全局的情况下才能工作。我们不知道背景,但w绝对是唯一的本地球员。通过将关闭这些变量的函数传递给闭包而不是字符串,可以解决此问题


有关它的更多信息:

可能是范围问题。setTimeoutfunction{background.resizeTow,724;},10000行吗?我希望你知道10000是10秒。所以你看不到任何即时的变化。编辑:啊,是的,@John是对的,w是问题所在。但是,您应该传递函数,而不是传递字符串。我已将编辑回滚到帖子,因为它使现有答案无效。正确,但不是传递字符串,你真的应该传递一个函数。在野外进行匿名闭包并不比在一天结束时进行eval好多少。传递字符串也是有效的,但这种做法很糟糕。后一种方法甚至不应该按照ECMAScript规范工作:setTimeout不是规范的一部分。window是一个主机对象,它不在specification.FWIW(必须由全局对象实现的属性)中。但是setTimeout和朋友都不是其中的一部分。我真的很难跟上你的最后一步。。您所说的是不正确的?您关于ECMAScript规范不允许setTimeout获取字符串的声明是不正确的,因为setTimeout不是规范的一部分。可能没有定义setTimeout per say,但其中一定有回调函数的内容