强制传递一个匿名函数,该函数将对象作为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(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版本是可以的。
- 在javascript中调用函数/对象引用时,可容纳任何数据类型
- 访问函数对象的上下文属性|如何
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- 如何将函数对象从javascript传递到Polymer元素
- 为什么函数对象的实例没有继承函数原型属性
- 为什么我会从 JavaScript 函数返回一个命名函数(对象)
- 为什么实例构造函数指向最上面的函数构造函数对象
- 使用object.freeze()扩展函数对象-can't添加字段
- 为什么'这'与函数对象一起使用时会有不同的处理方式
- setTimeout()/setInterval()赢得't执行**我正在传递函数对象,而不是执行函数
- 为什么茉莉花间谍不't通过引用解析函数对象
- 在 mongo map 中调用外部 javascript 函数(对象)或减少上下文的可能方法
- 在 JavaScript 中为函数对象添加别名
- 在 Express JS 中从路由调用函数对象
- 函数对象的名称属性是什么
- 构造函数对象
- 节点.js - 从另一个函数/对象发出事件
- 声明函数是否会创建具有函数名称和分配给它的函数对象的变量
- 函数对象__proto__和原型属性
- 类仿真 - 模块模式与函数对象