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

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

本文关键字:函数 对象 javascript 返回 参数 一个      更新时间:2023-09-26

我有以下代码

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(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版本是可以的。