在javascript中使用“with”语句,在一些极端罕见的情况下

时间:2014-06-04 18:39:39

标签: javascript

首先我知道:

  

建议不要使用with语句,因为它可能是来源   混乱的错误和兼容性问题。请参阅" Ambiguity Con"   "描述"中的段落以下部分详情。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with

BUT

如果我们采用这样一个简单的函数(这个功能很棒)

function loadImage(url,cb){
 with(new Image)
  onload=cb,
  src=url
}

我们注意到没有任何 CONFUSING 可以破坏函数闭包内的代码。我们使用的唯一两个变量是onload& src。在我不创建名为variables, objects,arrays or functionsonload的{​​{1}}之前,不应该发生任何不好的事情。

说,我的问题是:

javascript垃圾收集器应该在执行后直接将src添加到集合中吗?

因此对内存的影响小于标准函数:

new Image

在上面的例子中,function loadImage(url,cb){ var image=new Image; image.onload=cb; image.src=url; } 保留在函数内部,直到我执行一个新函数。 顺便说一句。代码也会短得多。

var image

使用

进行演示

http://jsfiddle.net/5wqm3/4/

1 个答案:

答案 0 :(得分:1)

  

首先我知道:不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源

不,with语句的主要问题是它会阻止某些静态优化,因为它在运行时引入了新的变量名 。这也是forbidden in ES 5 strict mode code的原因。

  

使用with语句对内存的影响要小于标准函数

没有。 它们的表现完全相同。当函数结束时,new Image / image不再适用于任何范围。 image变量将以与with语句以结束括号结尾相同的方式消失。

  

javascript垃圾收集器应该在执行后直接将new Image添加到集合中吗?

实际上,我并不认为该对象是垃圾收集的。它是一个DOM元素,有一个等待它的活load处理程序,我认为它仍然是从事件循环队列引用的。但是,我认为这对你的问题并不重要。