Как динамически построить функцию в JavaScript - PullRequest
3 голосов
/ 29 ноября 2011

Я хочу создать функцию динамически, используя JavaScript. Я начал со следующего:

function setFunc(setName){

    var  setName =  function () {
                    };

}
setFunc("totop");

Я хочу установить функцию динамически, но она не работает!

Как я могу это исправить?

Ответы [ 3 ]

6 голосов
/ 29 ноября 2011

Это не сработает.

Однако учтите следующее: функции в JavaScript - это просто значения , а window - область верхнего уровня , поэтому. (Предполагается, что желательно, чтобы новая функция создавалась в области верхнего уровня.)

function setFunc (name) {
    window[name] = function () { alert("hi!") }
}
setFunc("a")
window.a()    // "hi!" - explicit property access on object
window["a"]() // "hi!" - ditto
a()           // "hi!" - window implicit as top-level

Однако Я не рекомендую такой глобальный побочный эффект...

Удачного кодирования.

4 голосов
/ 29 ноября 2011

Вопрос в том, в каком контексте вы хотите создать эту функцию.Если вы действительно хотите создать глобальную функцию с таким именем, сделайте это так:

function setFunc( setName ) {
    this[ setName ] = function() {
        alert('I am ' + setName);
    };
}

setFunc('totop');

Однако, это не очень хорошая идея, чтобы заглушить глобальный объект подобным образом.Кроме того, приведенный выше код сломается в строгом режиме es5.Однако, используя ключевое слово new, вы можете создать такие конструкции, как

new setFunc('foobar').foobar();

или просто сохранить результат в переменной

var myObj = new setFunc('BoyohboyWhatALongString');
console.log( myObj ); // BoyohboyWhatALongString() is in there now
1 голос
/ 29 ноября 2011

Не Используйте функцию eval следующим образом:

function setFunc(setName){
    eval (setName + " = function () { };");
}
setFunc("toTop");

Вы можете получить доступ к области окна в виде ассоциативного массива и определить функцию с таким именем:

function setFunc (name) {
    window[name] = function () { }
}
...