Как передать имя объекта в качестве параметра через переменную, определенную как функция, в другую функцию? - PullRequest
0 голосов
/ 09 апреля 2019

В моем расширенном коде я получаю TypeError, и я думаю, что это связано с тем, что я не смог успешно передать объект в качестве параметра из одной функции, затем через переменную, определенную как функцию, и затем перейти к конечной функции.

В частности, я вызываю переменную executeOnce (которая определяется как функция) и передаю ей параметр options.Эта самоисполняющаяся функция должна затем передать этот параметр options в funB() (то есть funB(options)), но я не думаю, что переданный аргумент делает его равным funB().Отсюда и ошибка.

Чего мне не хватает?

В приведенном ниже коде это работает, если я заменяю funB(options); на строку (т.е. funB("options");), но я не могу этого сделать, потому что в своем расширенном коде я передаю различные аргументы.

const obj = {
    options: {
        spam: 4
    },
};

function funB(options) {
    obj[options].spam = 6; // the console log below should print "6" but doesn't
}

var executeOnce = (function (options) {
    var executed = false;
    return function () {
        if (!executed) {
            executed = true;
            funB(options); // the function works if i change this to 'funB('options');'
        }
    };
})();

funA('options');
function funA(options) {
    executeOnce(options);
}

console.log('= ' + obj.options.spam)

Ответы [ 3 ]

2 голосов
/ 09 апреля 2019

Вы не правы в executeOnce, вы используете синтаксис immediate function для создания значения для переменной executeOnce (звучит хорошо), но executeOnce - это функция без any парм, вы можете увидеть свой оператор return ,

var executeOnce = (function (options) { // `options` - does not make sense
    var executed = false;
    return function () {
        if (!executed) {
            executed = true;
            funB(options);
        }
    };
})();

Попробуй, верни функцию, которая имеет options параметр.

 var executeOnce = (function () {
    var executed = false;
    return function (options) {
        if (!executed) {
            executed = true;
            funB(options);
        }
    };
})();
0 голосов
/ 09 апреля 2019

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

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

// Main
const obj = { options: { spam: 4 } };
funA(obj.options);
console.log("finally...");
console.log('obj.options.spam = ' + obj.options.spam);

// Functions
function funB(options){
  console.log("funB got..."); console.log(options);
  options.spam = 6;
  console.log("funB set options to..."); console.log(options);
}

function executeOnce(options){
  // context for closure (IIFE)
  console.log("executeOnce got..."); console.log(options);
  var executed = false;
  var newFunc = function(options){
    console.log("newFunc got..."); console.log(options);
    if(!executed){
      executed = true;
      funB(options);
    }
  };
  return newFunc(options);
};

function funA(options){ 
  console.log("funA got..."); console.log(options);
  executeOnce(options);
}
0 голосов
/ 09 апреля 2019

    const obj = {
        options: {
            spam: 4
        },
    };

    function funB(options) {
        if(obj[options]==undefined)
          obj[options]={};
        obj[options].spam = 6;
    }

    var executeOnce = (function (options) {
        var executed = false;
        return function (options) {
            if (!executed) {
                executed = true;
                funB(options); // the function works if i change this to 'funB('options');'
            }
        };
    })();
    funA('optionsA');
    function funA(options) {
        executeOnce(options);
    }
    console.log(obj)
...