Как превратить Строку в вызов функции JavaScript? [дубликат]

У меня была такая же проблема, и она била меня по голове в течение 3 дней. Я наткнулся на вышеупомянутые решения, и они работали в Firefox и Edge, но в Chrome, независимо от того, что я делал, я все еще был заблокирован влево и вправо. Другая проблема была, когда я вызывал функцию из события нажатия кнопки в диалоге входа не был заблокирован, но не получил никаких ответов после закрытия диалогового окна входа в систему для дальнейших действий, поэтому я застрял. Таким образом, мое решение заключается в следующем, но вам не нужно нажимать кнопку входа в систему, она будет перенаправлена ​​на страницу входа в FB без события нажатия кнопки, а при возврате продолжите все остальные шаги SDK. Просто добавьте это в свой код и посмотрите, поможет ли это, отрегулируйте его в соответствии с вашими потребностями

function statusChangeCallback(response) {
            console.log('statusChangeCallback');
            console.log(response);


            // The response object is returned with a status field that lets the
            // app know the current login status of the person.
            // Full docs on the response object can be found in the documentation
            // for FB.getLoginStatus().
            if (response.status === 'connected') {
                // Logged into your app and Facebook.
                document.getElementById('Image2').style.display = "none";
                document.getElementById('mail').style.display = "in-line";

                testAPI();
            } else {
                // The person is not logged into your app or we are unable to tell.
                window.alert("Faça login no facebook antes de continuar - Obrigado");
                window.location.href = 'https://www.facebook.com/dialog/oauth' +
                '?client_id=55215442252214521548' +
                '&scope=public_profile,email,user_friends' +
                '&redirect_uri=' + encodeURIComponent(document.URL);
                document.getElementById('Image2').style.visibility = "hidden";
                document.getElementById('mail').style.display = "in-line";

            }
        }

        // This function is called when someone finishes with the Login
        // Button.  See the onlogin handler attached to it in the sample
        // code below.
        function checkLoginState() {
            FB.getLoginStatus(function (response) {
                statusChangeCallback(response);

            });
        } 
255
задан Brett DeWoody 23 July 2017 в 05:13
поделиться

6 ответов

Я ненавижу eval, и я не одинок :

var fn = window[settings.functionName];
if(typeof fn === 'function') {
    fn(t.parentNode.id);
}

Редактировать: В ответ на комментарий @ Mahan: В этом конкретном случае settings.functionName будет «clickedOnItem» . Это во время выполнения переведет var fn = window [settings.functionName]; в var fn = window ["clickedOnItem"] , что приведет к получению ссылки на функцию clickedOnItem (nodeId) {} ​​. Если у нас есть ссылка на функцию внутри переменной, мы можем вызвать эту функцию, «вызвав переменную», то есть fn (t.parentNode.id) , что равно clickedOnItem (t.parentNode .id) , что и требовалось OP.

Более полный пример:

/* Somewhere: */
window.settings = {
  /* [..] Other settings */
  functionName: 'clickedOnItem'
  /* , [..] More settings */
};

/* Later */
function clickedOnItem (nodeId) {
  /* Some cool event handling code here */
}

/* Even later */
var fn = window[settings.functionName]; 
/* note that settings.functionName could also be written
   as window.settings.functionName. In this case, we use the fact that window
   is the implied scope of global variables. */
if(typeof fn === 'function') {
    fn(t.parentNode.id);
}
358
ответ дан 23 November 2019 в 02:46
поделиться
window[settings.functionName](t.parentNode.id);

Нет необходимости в eval ()

71
ответ дан 23 November 2019 в 02:46
поделиться

JavaScript has an eval function that evaluates a string and executes it as code:

eval(settings.functionName + '(' + t.parentNode.id + ')');
14
ответ дан 23 November 2019 в 02:46
поделиться

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

Сохранить функцию

Сохранить функцию как функцию, а не как строку, и использовать ее как функцию позже. Где вы на самом деле сохраните функцию, зависит от вас.

var funcForLater = clickedOnItem;

// later is now
funcForLater(t.parentNode.id);

или

someObject.funcForLater = clickedOnItem;    
// later is now    
(someObject.funcForLater)(t.parentNode.id);

Сохранить имя функции

Даже если вам нужно сохранить имя функции в виде строки, вы можете минимизировать сложность, выполнив

(eval(settings.functionName))(t.parentNode.id);

, который минимизирует количество Javascript вы должны создать и оценить.

Словарь обработчиков

Поместите все функции действий, которые могут вам понадобиться, в объект и назовите их в стиле словаря, используя строку.

// global
itemActions = { click: clickedOnItem, rightClick: rightClickedOnItem /* etc */ };

// Later...
var actionName = "click"; // Or wherever you got the action name
var actionToDo = itemActions[actionName];
actionToDo(t.parentNode.id);

(Незначительное примечание: если вместо этого здесь вы использовали синтаксис itemActions [actionName] (t.parentNode.id);

13
ответ дан 23 November 2019 в 02:46
поделиться

Если settings.functionName уже является функцией, вы можете сделать это:

settings.functionName(t.parentNode.id);

В противном случае это также должно работать, если settings.functionName просто имя функции:

if (typeof window[settings.functionName] == "function") {
    window[settings.functionName](t.parentNode.id);
}
8
ответ дан 23 November 2019 в 02:46
поделиться
eval("javascript code");

он широко используется при работе с JSON .

-7
ответ дан 23 November 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: