Javascript函数调用参数对象的成员

时间:2016-08-25 01:47:38

标签: javascript

使用Javascript:

var myfunc = function(foo, bar) {
  foo.thing();
  bar.stuff();
  };

如果foobar始终是包含函数thingstuff的对象,但foobar尚未声明为全局变量,因为它们可以是满足此条件的许多对象中的任何一个,声明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()未定义的错误状态。

4 个答案:

答案 0 :(得分:1)

编辑:具体案例

app.get("/", myfunc(req, res));更改为app.get("/", myfunc);。 这将正确运行该功能。

另外,如果当前目录中存在app.set("views", __dirname + "html");文件夹,我相信app.set("views", __dirname + "/html");应为html

完整答案

JavaScript是动态类型

你所拥有的一切都很完美。声明foo函数时,没有必要声明barmyfunc()个对象。

但是,如果有人将对象传递给myfunc并且没有thingstuff方法的对象,则会遇到一些问题。因此,为了避免错误,您可以通过几种方式进行检查。

验证方法

首先要看对象是否有正确的方法:

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()

声明为参数的变量是该函数的本地变量。您不必担心全球foobar干扰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 之外没有任何问题。