【问题标题】:Enforce passing a anonymous function that returns an object as a parameter in javascript强制传递一个匿名函数,该函数返回一个对象作为javascript中的参数
【发布时间】:2012-01-06 12:10:05
【问题描述】:

我有以下代码

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
   }
}

我知道我可以执行以下操作,并且上述检查将起作用,但我想将我的所有逻辑都包含在括号中的 aFunction 参数中,如代码 sn-p 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'); 
   }

}

【问题讨论】:

  • 我不确定我是否完全理解 - 您是否想要选项 #4 但只是在通话中内联 function() {...}?这样,您将在“aFunction 参数内部”传递匿名函数。
  • 对了,你考虑过只做aFunction({ data: {...}, someOtherData: [...] });吗?

标签: javascript anonymous-function argument-passing


【解决方案1】:

我很好奇在我的函数方法aFunction 中是否有强制方法,传递的参数必须是匿名函数。

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

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

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

当然,这并不能确保传入的函数会以正确的格式返回值。它也不能确保它是一个匿名函数。

您的 2 号语法按原样很好,其优点是可以将任何工作变量保持在当前范围之外(假设不会破坏某些内容),但就确保您不会忘记的既定目标而言在您的其他处理结束时调用aFunction(),嗯...我的意见是它只会让其他人更难阅读代码。

编辑:刚刚看到你更新的问题,你决定做我上面提到的事情(似乎你在我回答的同时更新)。说真的,我真的认为这是一个糟糕的设计模式,我只是真正提到它作为一种假设的解决方案 - 我认为我最初并没有明确表示我实际上并不推荐它。

在我看来,您最初的 1 号版本是最好的方法,或者如果您必须使用某个功能,您的 2 号版本也可以。

【讨论】:

  • 是的。感谢您的及时回复
猜你喜欢
  • 1970-01-01
  • 2017-12-20
  • 2021-04-21
  • 2021-04-10
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
相关资源
最近更新 更多