在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”?
答案 0 :(得分:1)
实际上,将function
和eval
结合起来可以做到你想要的:
// 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”!