调用参数对象成员的Javascript函数
Javascript:调用参数对象成员的Javascript函数,javascript,Javascript,Javascript: var myfunc = function(foo, bar) { foo.thing(); bar.stuff(); }; 如果foo和bar始终是具有函数thing和stuff的对象,但是foo和bar没有声明为全局变量,因为它们可能是满足此条件的许多对象中的任何一个,那么声明myfunc的正确方法是什么 如果myfunc是另一个对象的成员呢 编辑 不太常见的情况(node.js/express): var myfunc=function(req,res
var myfunc = function(foo, bar) {
foo.thing();
bar.stuff();
};
如果foo
和bar
始终是具有函数thing
和stuff
的对象,但是foo
和bar
没有声明为全局变量,因为它们可能是满足此条件的许多对象中的任何一个,那么声明myfunc
的正确方法是什么
如果myfunc
是另一个对象的成员呢
编辑
不太常见的情况(node.js/express):
var myfunc=function(req,res){
thatres.render()中的错误状态
是未定义的。您所拥有的将被认为是正确的。您只需要小心地传入遵守myfunc
契约的对象。这意味着您必须确保传入的对象分别包含函数thing()
和stuff()
声明为参数的变量是该函数的本地变量。您不需要担心全局
foo
或bar
会干扰myfunc
。但是,您还必须意识到,如果您定义了这些全局变量,除非您显式地传入它们,否则将不会使用它们。编辑:特定情况
将app.get(“/”,myfunc(req,res));
更改为app.get(“/”,myfunc);
。
这将正确运行该函数
另外,如果文件夹html
存在于当前目录中,我认为app.set(“视图”,“目录名+”html”)
应该是app.set(“视图”,“目录名+”/html”)
完整答案
JavaScript是动态类型化的
您拥有的非常好。在声明myfunc()
函数时,不必声明foo
和bar
对象
但是,如果有人将对象传递给没有thing
和stuff
方法的myfunc
,则会出现一些问题。因此,为了避免错误,有几种方法可以检查
验证方法
首先是查看对象是否具有正确的方法:
var myfunc = function(foo, bar) {
if (typeof foo.thing === 'function')
foo.thing();
if (typeof bar.stuff === 'function')
bar.stuff();
};
验证对象指令
您还可以确保对象是所需类的实例:
var Qux = function() {
return {
thing: function() {
console.log('I am a thing!');
},
stuff: function() {
console.log('Yikes! That\'s a bunch of stuff');
}
};
};
var foo = new Qux();
var bar = new Qux();
var myfunc = function(foo, bar) {
if (foo instanceof Qux)
foo.thing();
if (bar instanceof Qux)
bar.stuff();
};
myfunc(foo,bar);
如果您询问实际的函数调用,您可以简单地执行以下操作:
myfunc('obj1',obj2)
如果myfunc
是另一个对象下的属性,例如obj3
,则:
obj3.myfunc('obj1',obj2)
编辑:
在操作中编辑后,上述ans不再相关
你应该做的只是
app.get(“/”,myfunc);
一旦进入内部,对象将被重新声明为自变量,我建议您阅读此处的《你不知道JS》,了解函数如何声明以及这些对象隐式发生了什么:
您仍然需要进行一些检查,以确保可以调用您传递的对象,因为上面的答案有一个很好的方法
如果它是另一个对象的一部分,那么除了使用它之外就不会有任何问题。形式参数列表中的标识符对于函数来说是局部的,就像它们被声明一样,因此对于未声明的变量没有任何问题。但是,如果不将可调用对象作为第一个和第二个参数传递,则会有问题。我不这么认为理解这个问题的目的。:D你需要通过参数验证还是什么?你是在问如何进行实际的函数调用??JavaScript是动态类型的。你不能仅仅通过声明来强制变量的类型。你必须验证参数。对于node.js代码,你将使用
app.get(“/”),myfunc);
和app.get
将使用这两个参数调用函数。我将初始示例设置为通用,以使其灵活,但删除了()在我的特定实例中修复了它。另外,/html只是一个输入错误,将其移动到问题中,我的原始代码有/。我将更新问题以修复它。小心typeof测试。在不太现代的浏览器中,许多浏览器仍在使用中,可调用(主机或外来)对象可能不会返回“函数”可以返回各种值,如“未知”或“对象”。也有标准外来对象和非标准外来对象。
var Qux = function() {
return {
thing: function() {
console.log('I am a thing!');
},
stuff: function() {
console.log('Yikes! That\'s a bunch of stuff');
}
};
};
var foo = new Qux();
var bar = new Qux();
var myfunc = function(foo, bar) {
if (foo instanceof Qux)
foo.thing();
if (bar instanceof Qux)
bar.stuff();
};
myfunc(foo,bar);