JavaScript(NodeJS)等效于PHP的call_user_func_array()

时间:2014-11-13 15:00:22

标签: javascript php node.js

JavaScript(NodeJS)中是否存在类似于PHP的 call_user_func_arrayhttp://php.net/manual/en/function.call-user-func-array.php)的等效函数。这允许使用参数数组调用函数。

在我的情况下,我必须使用将在数组中的参数调用util.format

这是一个非常简单的例子,试图展示它。

var util = require("util");

function my_fundtion(items) {
  var format_string = "";
  for (var i=0; i < items.length; i++) {
    format_string += " %s";
  }
  return util.format(format_string, /* here I want to pass items in items array */);
}

2 个答案:

答案 0 :(得分:2)

PHP有:

call_user_func_array('myfunc', array(1, 2, "foo", false));

虽然JS有:

myfunc.apply(null, [1, 2, "foo", false]);

第一个null进入对象的位置。如果函数是一个方法,你将使用它。使用这种调用的一个示例是切片类似于数组的对象,这些对象根本不是数组,但看起来像一个(就像函数内部的arguments对象一样):

Array.prototype.slice.apply(arguments, []);

一般来说,语法是:

(afunction).apply(obj|null, array of arguments)

你可以试试这个:

function my_fundtion(items) {
    var format_string = "";
    for (var i=0; i < items.length; i++) {
        format_string += " %s";
    }
    var new_items = items.slice();
    new_items.unshift(format_string);
    return util.format.apply(null, new_items);
}

恕我直言,这是一个错误的功能方法。你试过以下这个吗?

function my_fundtion(items) {
    return items.join(" ");
}

答案 1 :(得分:0)

因为函数名称引用的call_user_func_array调用函数是字符串。所以,在JS中我们需要使用eval

示例:

const popup = (msg) => {
 alert(msg);
}

const subject = {
 popup(msg) {
  alert(msg);
 }
}

所以,

eval("popup").apply(null, ['hi'])
eval("subject.popup").apply(null, ['hi'])

纠正我。如果我错了。 ;)