调用参数对象成员的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

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){
that
res.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);