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