任何方法来重置一个Function对象"这个"引用BEFORE构造函数调用?

时间:2018-05-29 22:46:14

标签: javascript

尝试实施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"从那个范围看不到)?

4 个答案:

答案 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

所以你需要两步......

  1. 创建您将从..

  2. 创建对象的功能
  3. 使用此功能使用new ..

  4. 创建实例

    下面是一个简单的例子..

    &#13;
    &#13;
    var fcreate = 
      new Function('global', "this.global = global");
    
    var f = new fcreate("hello");
    
    console.log(f.global);
    &#13;
    &#13;
    &#13;

    如果您不关心实例,我们可以完全忘记this,只需创建一个捕获的范围作为参数..

    例如..

    &#13;
    &#13;
    var f = new Function("global", "console.log(global)");
    
    f("This is a global to function");
    
    f("This is another one");
    &#13;
    &#13;
    &#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();