with(window){}不适用于IE中的新弹出窗口

Sha*_*nta 4 javascript

我打开一个窗口,想在某些条件下进行一些计算.问题是在IE中,只有第一呼叫test(从ready)是由新窗口中执行,但后续调用test(带的setTimeout设置)在父窗口而不是用于新窗口(即执行win).

它在FF中工作正常.

说明代码(此代码在父窗口中):

var win = window.open(some_url, window_name, argument_string);

with (win) {
    function test() {
        alreadyrunflag += 1;
        if (alreadyrunflag < 10) {
            window.setTimeout(function() { test(); }, 500);
        }else { 
            //perform calculation
        }
    }

    jQuery(win.document).ready(function() {
        alreadyrunflag = 0
        test();          
    });
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

强烈建议不要with在这种情况下使用(坦率地说,几乎任何其他情况).相反,只需编写win.必要的地方.就像Eric Meyer一样,我不是 "被认为有害"的散文的忠实粉丝,但道格拉斯克罗克福德的这篇文章我完全同意.

with修改"范围链",使其需要严格的JavaScript知识才能完全理解.有关详细信息,请参阅Crockford的文章.它还引入了速度惩罚(虽然我已经听过人们对它们的咆哮,但我怀疑成本真的那么高).对可维护性的影响是不可接受的.此外,您不能在新的严格模式(MDC链接)中使用它,这是一种有用的模式,可以帮助您避免一些常见的错误.

在这种情况下,在我看来,范围链应该以您期望的方式解决(以及Firefox显然正在这样做的方式),但坦率地说,我对IE的JScript实现无法处理它并不感到震惊一样的方法.和/或它可能是一个jQuery最终被使用的问题(打开窗口中的那个或刚刚打开的窗口中的那个;你不能确定,它将是时间依赖的... yuck) .

  • 确实.例如,查看`window.setTimeout`:这可能会解析为`win.window.setTimeout`,或者只是`window.setTimeout`. (2认同)