如何通过定义为函数的变量将对象名称作为参数传递给另一个函数?

时间:2019-04-09 03:30:15

标签: javascript object scope arguments

在我的扩展代码中,我收到一个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 个答案:

答案 0 :(得分:2)

您在executeOnce上错了,您使用immediate function语法为executeOnce变量建立了一个值(听起来不错),但是executeOnce是一个没有{{1 }} parmas,您可以看到自己的return语句。

any

尝试一下,返回一个带有var executeOnce = (function (options) { // `options` - does not make sense var executed = false; return function () { if (!executed) { executed = true; funB(options); } }; })(); 是参数的函数。

options

答案 1 :(得分:0)

    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)

答案 2 :(得分:0)

我认为您可能会创建比您需要的功能更多的功能,但这并没有破坏任何功能。问题似乎在于返回的函数(关闭)不了解options,可以通过在调用返回的函数时将options作为参数来解决。

我给返回的函数起了newFunc的名字,并在整个脚本中添加了print语句,以澄清每一步的情况(这使调试方法更容易。)

// 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);
}