dev*_*os1 10 javascript class function
给定一个字符串classname,我想动态创建一个以该字符串命名的新JavaScript函数,该函数可用于实例化对象.
我尝试过使用eval()但由于某种原因,声明的函数不会出现在全局(窗口)范围内.
eval( "function " + classname + "() {}" );
window[ classname ]; // => undefined
Run Code Online (Sandbox Code Playgroud)
有没有办法可以动态创建一个以字符串命名的新函数?
或者,或者,通过创建它后,给我一些方法来引用创建的函数eval.有趣的是,当我在Safari中调试它时,它看起来像一个局部变量.
更新:
得到它了!当然很明显,我只是eval再次使用来创建实例:
var myInstance = eval( "new " + classname );
myInstance.constructor.name; // => classname (yay)
Run Code Online (Sandbox Code Playgroud)
这应该适用于我的情况,因为我只需要在声明后立即创建一个类的实例.对于一般情况,虽然看到Pointy的答案.
Poi*_*nty 11
是:
window[classname] = function() { ... };
Run Code Online (Sandbox Code Playgroud)
现在,诚实地说,这与你的尝试不完全相同,但它非常接近.当您通过类似的function 表达式实例化一个函数,并且没有名称时,除了通过外部作用域中的名称(在本例中为全局作用域)之外,该函数不能引用自身.
如果这很重要,你可以做的是:用一些股票"内部"名称创建函数,然后将其分配给全局名称:
function secretName() { ... }
window[classname] = secretName;
Run Code Online (Sandbox Code Playgroud)
小智 7
function registerFunction(functionBody) {
"use strict";
var script = document.createElement("script");
script.innerHTML = "function " + functionBody;
document.body.appendChild(script);
}
registerFunction("fooBar(x, y) { return x + y; }");
fooBar(1, 2); // will give you 3
Run Code Online (Sandbox Code Playgroud)
虽然这基本上是相同的,eval()但它将在当前页面的域中注册该函数.您可以稍后删除此脚本元素,或将其重用于其他功能.
| 归档时间: |
|
| 查看次数: |
17551 次 |
| 最近记录: |