从继承父作用域的字符串创建函数

时间:2010-02-18 02:58:52

标签: javascript function scope

在Javascript中,有没有办法从字符串创建函数(例如通过新的Function()构造函数)并让它继承父作用域?例如:

(function(){
    function yay(){
    }
    var blah = "super yay"
    yay.prototype.testy = new Function("alert(blah)")
    yay.prototype.hello = function(){alert(blah)}
    whee = new yay();
    whee.hello()
    whee.testy()
})()

有没有办法让whee.testy()也提醒“超级yay”?

6 个答案:

答案 0 :(得分:1)

实际上,将functioneval结合起来可以做到你想要的:

// blah exists inside the 'hello' function
yay.prototype.hello = function(){ alert(blah) }
// blah also exists inside the 'testy' function, and
// is therefore accessible to eval().
yay.prototype.testy = function(){ eval('alert(blah)') }

答案 1 :(得分:1)

(function(){
    function yay(){
    }
    var blah = "super yay"
    yay.prototype.testy = eval("(function(){alert(blah)})")//new Function("alert(blah)")
    yay.prototype.hello = function(){alert(blah)}
    whee = new yay();
    whee.hello()
    whee.testy()
})()

这似乎对我有用,并且没有任何评估数据来自任何不受信任的来源。它只是用于缩小代码。

答案 2 :(得分:1)

这可以给你你想要的......

var inputAction = "alert(blah)";
yay.prototype.testy = eval("(function(){ " + inputAction + "; })")

它基本上将你想要的动作包装在一个匿名函数中,这在eval上得到了完全的评估,但是没有立即运行,它被包装成一个函数。

你可以在这里走得更远,但不知道你想要完成什么,很难说。

答案 3 :(得分:0)

whee.testy不起作用的原因是因为使用new Function("alert(blah)")声明函数会在当前闭包之外创建函数。由于blah是在闭包内定义的,因此您无权访问它,并且它会抛出一个未定义的错误。

以下是概念证明示例:

var blah = "global (window) scope";

(function(){
    function yay(){
    }
    var blah = "closure scope";

    yay.prototype.testy = new Function("alert(blah)");
    yay.prototype.hello = function(){ alert(blah); }
    whee = new yay();
    whee.hello();
    whee.testy();
})();

答案 4 :(得分:-1)

你的意思是评估?

(function(){
    function yay(){
    }
    var blah = "super yay"
    yay.prototype.testy = new Function(eval("alert(blah)")) // <---------------
    yay.prototype.hello = function(){alert(blah)}
    whee = new yay();
    whee.hello()
    whee.testy()
})()

然而,这里有两个道德上令人反感的JS特征。 1)eval是“邪恶的”,并且 2)eval中的代码可以看到外面的变量。

答案 5 :(得分:-1)

您不需要eval。

你必须将blah连接到字符串函数,但JavaScript会抱怨没有“;”在串联之前,这是因为当你连接它时,blah只是一些文本。你必须绕变量blah转义两个“\”,以使它看起来像一个带有文本的字符串。

(function(){
    function yay(){
    }
 var blah = "super yay"

 yay.prototype.testy = new Function("alert(\""+blah+"\")")
 yay.prototype.hello = function(){alert(blah)}
 whee = new yay();
 whee.hello()
 whee.testy()
})()

这会两次警告“超级yay”!