繁体   English   中英

强制传递一个匿名函数,该函数将对象返回为javascript中的参数

[英]Enforce passing a anonymous function that returns an object as a parameter in javascript

我有以下代码

1)  var x = {};
    x.data = {name: 'name', lname: 'lname'};
    x.someOtherData = ['blah','blah','irrelevant'];
    aFunction(x);

因此,我多次调用上述语句组,语句的顺序当然很重要。 有时我忘记做最后一条语句aFunction(x),这使我很头疼,所以我做了以下工作:

2) aFunction(function(){
    var x = {};
    x.data = {name: 'name', lname: 'lname'};
    x.someOtherData = ['blah','blah','irrelevant'];
    return x; 
   }());                     

哪个可行,我很好奇我的函数方法aFunction中是否有一种方法强制传递的参数必须是匿名函数。 我要从该匿名函数返回一个对象,因此以下操作显然不起作用

3) function aFunction(x) {
    if(x.constructor == Function) {
      alert('yay you're doing it right'); 
    } else { 
     alert('nay, you're doing it wrong'); //this is what happens given that x.constructor == Object
   }
}

我知道我可以执行以下操作,并且上面的检查将起作用,但是我想将所有逻辑放在括号内的Function参数中,如代码片段2所示:

4) var z =  function(){
   var x = {};
   x.data = {name: 'name', lname: 'lname'};
   x.someOtherData = ['blah','blah','irrelevant'];
   return x; 
  };
  aFunction(z);  

有任何想法吗?

更新:

没关系,我想通了。 我不能像现在那样立即调用匿名函数,而不能在aFunction方法中调用它。 当然,可以帮助您在堆栈溢出中写出您的问题,从而使问题和解决方案更加清晰。 仍然对其他人如何解决类似问题持开放态度。 设计模式等

解:

aFunction(function(){
var x = {};
x.data = {name: 'name', lname: 'lname'};
x.someOtherData = ['blah','blah','irrelevant'];
return x; 

});

function aFunction(x) {
if(x.constructor == Function) {
      alert('yay you're doing it right'); 
      x(); //call it here
    } else { 
     alert('nay, you're doing it wrong'); 
   }

}

我很好奇我的函数方法aFunction是否有一种强制执行的方法,即所传递的参数必须是匿名函数。

但是您没有传递匿名函数。 您正在调用匿名函数并传递结果。

您可以传递一个函数(而不是调用函数的结果),然后在aFunction(x)测试x是一个函数,然后调用它以获取要使用的值/对象:

function aFunction(x) {
    if(typeof x === "function") {
        var workingValue = x();
    }
}

但这当然不能确保传入的函数将以正确的格式返回值。 同样,它不能确保它是一个匿名函数。

您的2号语法就可以了,它的优点是将任何工作变量都保留在当前范围之外(假设不会破坏某些内容),但是要达到您确定的目标,即确保您不要忘记调用aFunction()在其他处理结束时,嗯... 我的看法是,这只会使其他人难以阅读代码。

编辑:刚看到您更新的问题,您决定去做我上面提到的事情(似乎您在回答的同时正在更新)。 认真地说,我真的认为这是一种糟糕的设计模式,我只是将其作为一种假设的解决方案而提及-我认为我一开始并没有明确指出我实际上并没有推荐它。

我认为您的原始数字1版本是最好的方法,或者,如果您必须使用某个功能,那么数字2版本也可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM