2014-01-17 6 views
1

Я хочу передать два имени функции функции с JSON, но не могу заставить ее работать. Я нахожусь над моей головой.имя функции функции для функции с JSON

Вот мои функции. myFunc должен вызывать две функции, которые передаются ему (myBefore и myAfter).

function myFunc(obj) { 
    var func = $.parseJSON(obj); 
    if (typeof func[before] === "function") func[before](); 
    // do some stuff 
    if (typeof func[after] === "function") func[after](); 
} 

function myBefore() { 
    alert("before"); 
} 

function myAfter() { 
    alert("after"); 
} 

и вот как я звоню MyFunc

myFunc({"before": "myBefore", "after" :"myAfter"}); 
+0

FUNC [до того] является строкой ... не является функцией. – epascarello

ответ

0

MyFunc предполагается вызвать 2 функции, которые передаются ему

Вы нужно c щеколда это нравится func["before"], Как в вашей реализации func[before] является строка не функция

function myFunc(func) { 
    //You don't need to parse. As its already a JSON 
    //var func = $.parseJSON(obj); 

    if (typeof func["before"] === "function") 
     func["before"](); 

    // do some stuff 

    if (typeof func["after"] === "function") 
     func["after"](); 
} 

var myBefore = function() { 
    alert("before"); 
} 

var myAfter = function() { 
    alert("after"); 
} 

myFunc({ 
    "before": myBefore, 
    "after": myAfter 
}); 

DEMO

+0

Спасибо за рабочую демонстрацию Satpal. Можете ли вы объяснить, почему функции myBefore и myAfter назначаются как переменные, и можно ли просто создавать их как функции, как в моем исходном коде? – Damian

+0

@ Дамиан, я так предпочитаю. Использование именованной функции также будет работать. Пример: http://jsfiddle.net/HBLA4/1/. Для получения дополнительной информации посетите http://stackoverflow.com/questions/114525/the-difference-between-the-two-functions-function-x-vs-var-x-function – Satpal

+0

Это работает отлично! Я действительно предпочитаю ваш ответ Кевину ... Я думаю, что код выглядит чище. Если бы я мог наградить вас жирным ответом, я бы, но я уже принял Кевина :( – Damian

0

Как насчет этого? window["yourfunctionname"]();

 var FunctionName = func[before];   
     if (typeof(window[FunctionName]) === "function") 
    { 
     window[FunctionName](); 
     } 

ИЛИ

function myFunc(obj) { 
     var func = $.parseJSON(obj); 
     if (func[before] === "myBefore") { before();} 
     // do some stuff 
     if (func[after] === "myAfter") { after(); } 
    } 
0

Что-то вроде ...

function myFunc(obj) { 
var func = $.parseJSON(obj); 
     if (typeof func[before] === "function") func.before(); 
     // do some stuff 
     if (typeof func[after] === "function") func.after(); 
    } 
0

Вы не вызывая Funciton. Что вы действительно делаете:

("myBefore")(); 

который является ошибкой.

Если функции myBefore и myAfter находятся в глобальной области видимости, вы можете использовать окно ["stringName"].

function myFunc(obj) { 
    //var func = $.parseJSON(obj); //if it is object being passed in than this is an error 
    var func = obj; 
    window[func[before]](); 
    window[func[after]](); 
} 
0

Поскольку функции объявлены глобально, их можно получить из глобального объекта (окна).

function myFunc(obj) { 
    if (typeof window[obj.before] === "function") window[obj.before](); 
    // do some stuff 
    if (typeof window[obj.after] === "function") window[obj.after](); 
} 

function myBefore() { 
    alert("before"); 
} 

function myAfter() { 
    alert("after"); 
} 

myFunc({"before": "myBefore", "after" :"myAfter"}); 

JS Fiddle:http://jsfiddle.net/wvPgA/

+0

Это работает! Спасибо, Кевин! – Damian

+0

@ Damian Glad Я могу помочь! –

Смежные вопросы