尝试实施Javascript沙盒方案,现在我遇到了一些皱纹。我需要传递一个" context"代码的参数,它基本上可以作为" global"的一个句柄。对象,但到目前为止没有运气。
为了用一个简单的例子说明问题,请考虑以下代码:
var foo = new Function(" this.baz = this.mux; return this ");
foo.mux = "mux";
foo.call();
console.log(foo.baz);
console.log(foo.toString());
输出:
$>未定义
$> function anonymous(){this.mux;归还这个; }
它显然不起作用,因为Function对象似乎没有像这个那样这个,就像用 new 创建的普通函数一样。
所以...有没有办法重新安排"功能这个预先指向自己(或者只是问题的任何其他方式)?
修改
好的,根据我在评论部分的理解,我需要一个构造的对象。
var foo = new Function(" return new function(){ this.baz /* = ?? */; return this; } ");
有没有办法以某种方式访问封闭的匿名函数的属性?喜欢" this.mux = foo.mux" (当然除了#34; foo"从那个范围看不到)?
答案 0 :(得分:2)
您可以将foo
作为通话参数传递:
var foo = new Function(" this.baz = this.mux; return this ");
foo.mux = "mux";
foo.call(foo); // <-- this
编辑:虽然上面的代码有效,但我不推荐它。你最好创建函数/类foo:
var Foo = function(mux){
this.baz = mux;
}
var foo = new Foo("mux");
console.log(foo.baz);
答案 1 :(得分:2)
我认为你对new Function(
的作用感到困惑。它不会创建对象的实例,只是创建一个函数。因此,与任何对象实例一样,您还需要在这些实例上使用new
。
所以你需要两步......
创建您将从..
使用此功能使用new
..
下面是一个简单的例子..
var fcreate =
new Function('global', "this.global = global");
var f = new fcreate("hello");
console.log(f.global);
&#13;
如果您不关心实例,我们可以完全忘记this
,只需创建一个捕获的范围作为参数..
例如..
var f = new Function("global", "console.log(global)");
f("This is a global to function");
f("This is another one");
&#13;
答案 2 :(得分:1)
我能想到的最好的确实有用。
var foo = new Function(" this.baz = this.mux; return this ");
var context = { mux: "mux" };
foo = foo.bind(context);
foo();
// context.baz == "mux"
答案 3 :(得分:0)
好吧所以这实际上是可行的,它基本上是Keith答案的延伸:
function verify(condition)
{
console.log(condition === true ? "pass" : "fail");
}
function test()
{
if(!(this instanceof test))
return new test();
var foo = new Function("mux", "return new function(){ this.baz = mux; return this; } ");
var bar = new foo(null);
verify(bar.baz === null);
var zim = new foo(this);
verify(zim.baz === this);
var qud = new foo(global);
verify(qud.baz === global);
};
test();
输出:
通
通
通
衷心感谢大家帮助我解决这个问题 - 欢呼!
*编辑*
根据Keith的评论,正确的实施只是:
function verify(condition)
{
console.log(condition === true ? "pass" : "fail");
}
function test()
{
if(!(this instanceof test))
return new test();
var foo = new Function("mux", "this.baz = mux; return this; ");
var bar = new foo(null);
verify(bar.baz === null);
var zim = new foo(this);
verify(zim.baz === this);
var qud = new foo(global);
verify(qud.baz === global);
};
test();