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

时间:2012-01-06 12:10:05

标签: javascript anonymous-function argument-passing

我有以下代码

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参数中,如代码片段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'); 
   }

}

1 个答案:

答案 0 :(得分:2)

  

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

但是你传递一个匿名函数。您正在调用匿名函数并传递结果。

你可以传递一个函数(而不是调用函数的结果),然后在aFunction(x)内你测试x是一个函数,然后调用它来获取值/对象与...合作:

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

但当然,这并不以任何方式确保传入的函数将以正确的格式返回值。此外,它不能确保它是匿名函数。

你的2号语法很好,保留任何工作变量超出当前范围的优势(假设不会破坏某些东西),但就你所说的确保你不会忘记的目标而言在你的其他处理结束时拨打aFunction(),好吧...... 我的意见只是让其他人更难阅读代码。

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

在我看来,你原来的1号版本是最好的方式,或者如果你必须使用一个功能你的2号版本就可以了。