是否可以使用eval动态命名函数?

时间:2014-02-28 22:42:16

标签: javascript eval

我正在编写一个类工厂,它是一个接受参数来定义类并返回一个javascript类(带有'this'上下文的函数)的函数,它是一个命名的函数,比如

function ClassName(){
   // ...
}

除了函数的命名之外,它的工作都非常好。似乎没有办法动态创建命名函数。

我承认,这绝对是一个风格问题,并没有改变类的功能。我真的很喜欢在控制台中看到类名,以及所有祖先类的名称。它确实使调试变得更容易。

目前我正在使用eval()来使用类似于。

的代码来完成此操作
function classGen(className, constructorFn, proto){
    var NamedClass;
    eval('NamedClass = function ' + className + '{ constructorFn.apply(this, arguments) };');
    for(var key in proto)
        NamedClass.prototype[key] = proto[key];
    return NamedClass;
}

等...

这会被视为eval功能的“安全”使用吗?

为什么/为什么不呢?

--- ---编辑

我不知道为什么我不考虑

className = className.replace(/[^a-z0-9]/gi, '');

3 个答案:

答案 0 :(得分:0)

user2864740在评论

中回答
  

只要您信任className,它就是“安全的”。

这是有道理的,但也引导我注意用户定义的“代码”的位置。 该字符串是在function关键字和一组括号之间注入的。因此,如果classname不是有效的函数名,则会发生错误。

答案 1 :(得分:0)

是的,有可能!

此代码在函数上使用名为displayName的属性,Firefox Developer Tools,Firebug和Google Chrome Developer Tools(部分)支持该属性:

function generateClass(name, constructor, prototype) {
    'use strict';

    var classPrototype = constructor.prototype;

    for (var key in prototype) {
        classPrototype[key] = prototype[key]

        if (typeof classPrototype[key] === 'function') classPrototype[key].displayName = name + '.' + key;
    }

    constructor.displayName = name;

    return constructor;
};

var Person = generateClass('Person', function(name) {
    this.name = name || 'John Smith';
}, {
    sayHello: function() {
        alert('Hello from ' + this.name + '!');
    }
});

// Try these in the console:
Person;
new Person('James Smith');

请注意,您可以使用displayName的任何字符串,例如var MalePerson = generateClass('My Person', ...

此外,您可以动态更改displayName

var Person = generateClass('Person', function(name) {
    this.name = name || 'John Smith';
    this.constructor.displayName = 'Person (' + this.name + ')';
}, {
    sayHello: function() {
        alert('Hello from ' + this.name + '!');
    }
});

// Try this in the console:
new Person('James Smith');

答案 2 :(得分:0)

这些功能在哪里定义?如果它们在全局范围内定义,则可以执行以下操作:

var name="fun";
window[name]=function(){};
window[name].name=name;