【发布时间】:2011-06-30 12:50:47
【问题描述】:
JavaScript 中的with 语句首先检查对象的请求属性是否存在,然后再决定是否应该设置给定对象的属性或全局对象的属性。
例子:
var x = {a:5};
with(x){
a = 6; //x.a is now 6
b = 7; //window.b is now 7, x.b still does not exist
}
我想更改with 的行为,以便当它检查我正在使用的对象上是否存在属性时,它会始终将其视为存在,从而防止块内的分配意外修改全局对象。
这可以通过重载检查对象属性是否存在的函数来实现吗?例如这样的:
Object.prototype.__hasOwnProperty__ = function(p){
return true;
}
var x = {a:5};
with(x){
a = 6; //x.a is now 6
b = 7; //x.b should now be 7
}
我的代码在 node.js 和 V8 上运行,因此解决方案是否仅适用于此并不重要。
希望有人知道我是如何实现这一点的。
感谢您的帮助!
【问题讨论】:
-
问题是:必须重载哪个函数才能使 with 语句中的代码定义 b ond 对象 x 而不是在窗口/全局对象上定义它?
-
您为什么不准确描述您想要完成的任务?
with语句不符合您的要求。您已经从上一个问题中知道了这一点。是否有某些原因您不会寻找更适合您使用的语言的任何解决方案? -
我想做的事:我想将全局对象与在 with 语句中执行的代码完全隔离开来。代码应该根本无法访问全局对象。这对我来说很重要。想象一下,您开发了一个无需重启即可 24/7 运行的服务器。该服务器使用 eval() 命令执行非常不同的脚本。当脚本在全局对象上定义变量时会发生什么?它会一直存在,直到服务器重新启动。这是内存泄漏;)
-
想象一下,你的 apache 服务器会将你的 php 曾经定义的所有全局变量保存在内存中,并且只会在重新启动时杀死它们;)你的内存当然不会开心;)
-
@FlashFan:您正在运行的脚本使用
eval()有什么原因吗?我不想这么说,但这是通常建议您避免使用的 javascript 的另一个功能。看来您正在尝试使用通常被认为是 javascript 的坏部分。
标签: javascript while-loop