使用Javascript:
var myfunc = function(foo, bar) {
foo.thing();
bar.stuff();
};
如果foo
和bar
始终是包含函数thing
和stuff
的对象,但foo
和bar
尚未声明为全局变量,因为它们可以是满足此条件的许多对象中的任何一个,声明myfunc
的正确方法是什么?
如果myfunc
是另一个对象的成员呢?
修改 不太通用的情况(node.js / express):
var express = require("express");
app = express();
app.set("views", __dirname + "html");
var myfunc = function(req, res) {
res.render("file.html");
};
app.get("/", function(req, res) {
myfunc(req, res);
});
// ^ OR v Tried both, but it doesn't get this far
app.get("/", myfunc(req, res));
app.listen(8080);
var myfunc = function(req, res) {
中res.render()
未定义的错误状态。
答案 0 :(得分:1)
编辑:具体案例
将app.get("/", myfunc(req, res));
更改为app.get("/", myfunc);
。
这将正确运行该功能。
另外,如果当前目录中存在app.set("views", __dirname + "html");
文件夹,我相信app.set("views", __dirname + "/html");
应为html
。
你所拥有的一切都很完美。声明foo
函数时,没有必要声明bar
和myfunc()
个对象。
但是,如果有人将对象传递给myfunc
并且没有thing
和stuff
方法的对象,则会遇到一些问题。因此,为了避免错误,您可以通过几种方式进行检查。
首先要看对象是否有正确的方法:
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);
答案 1 :(得分:0)
你所拥有的将被认为是正确的。您只需要小心传递符合myfunc
合同的对象。我的意思是你必须确保你传入的对象分别包含函数thing()
和stuff()
。
声明为参数的变量是该函数的本地变量。您不必担心全球foo
或bar
干扰myfunc
。但是,你必须意识到,如果你做定义了那些全局变量,除非你明确地传入它们,否则它们不会被使用。
答案 2 :(得分:0)
如果您询问实际的函数调用,您可以这样做:
myfunc('obj1',obj2)
。
如果myfunc
是另一个对象下的属性,请说obj3
,那么:
obj3.myfunc('obj1',obj2)
。
修改强>
在OP中编辑后,上面的ans不再相关
你应该干脆做
app.get("/", myfunc);
答案 3 :(得分:0)
一旦内部对象被重新声明为独立变量,我建议您阅读这里不知道JS是否有关于如何声明函数以及隐式对这些对象发生什么的良好入门:
https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20%26%20closures/ch1.md
您仍然需要进行一些检查以确保可以调用您传递的对象,因为最佳答案有一个很好的方法。
只要它是另一个对象的一部分,除了使用 this 之外没有任何问题。