javascript相当于php call_user_func

时间:2012-04-08 08:12:07

标签: javascript

我找到了这个我已实施的主题(见接受的答案):
javascript equivalent of PHP's call_user_func()

但是,我遇到了多个参数的问题。我意识到我正在做的是将我的参数转换为字符串并将其视为1参数,但我不知道如何解决这个问题,因为我正在动态创建参数。

意思是,我在代码中定义了以下内容:

var a = new Array();
a[0] = new Array();
a[0][0] = 'alert';
a[0][1] = '\'Hello World\'';
a[1] = new Array();
a[1][0] = 'setTimeout';
a[1][1] = 'alert("goodbye world")';
a[1][2] = '20';

后来,我这样称呼他们:

    var j = 0;
    var len = 0;
    var fx = '';
    var params = '';
    for( i in a ){
        params = '';
        len = a[i].length;
        fx = a[i][0]; // getting the function name
        a[i].splice( 0, 1 ); // removing it from array
        if( len > 1 ){
            params = a[i].join(", "); // trying to turn the parameters into the right format, but this is turning it into strings I think
            params = params.replace(/\\'/g,'\''); // bc i was adding slashes with PHP
        }
        window[fx](params);
    }

我不必使用数组来执行此操作。我不懂JS OOP(尚未尝试过),虽然我对PHP OOP感到满意,所以我不知道是否有办法在那里做到这一点。

任何有关传递多个参数的帮助都将受到赞赏。

感谢。

2 个答案:

答案 0 :(得分:13)

要做的第一件事:废弃整个代码,重新开始。你的方法不会让你到任何你想要的地方。 (不幸的是,我不能告诉你你想去哪里,因为我无法理解你的榜样。)

在JavaScript中调用函数有三种方法。

function foo() { console.log(arguments); }

// 1. directly
foo(1, 2, 3);

// 2. trough Function.call()
foo.call(this, 1, 2, 3);

// 3. trough Function.apply()
var args = [1, 2, 3];
foo.apply(this, args);

callapply相似。它们让您决定this关键字在函数内指向哪个对象(这是重要的位!)。

apply接受一组参数,call接受单个参数。

最接近call()的是PHP的call_user_func()。与apply()最接近的是PHP call_user_func_array()

JavaScript对象与PHP数组共享:它们是键/值对。

// an anonymous function assigned to the key "foo"
var obj = {
  foo: function () { console.log(arguments); }
};

这意味着您可以使用点表示法访问对象属性:

// direct function call
obj.foo(1, 2, 3);

或通过方括号表示法(注意对象键是字符串):

var funcName = "foo";
obj[funcName](1, 2, 3);
obj[funcName].call(obj, 1, 2, 3);
obj[funcName].apply(obj, [1, 2, 3]);

方括号表示法使您可以自由选择对象属性。如果此属性恰好是一个函数,apply()使您可以自由地动态选择函数参数。

尚未声明为某个对象属性的每个顶级函数都将成为全局对象的属性。在浏览器中,全局对象为window。 (因此我上面第一个代码块中的function foo()确实是window.foo。)

请注意,this在PHP中不起作用。它将指向函数已在上调用的对象,而不是函数"所属的对象"。 (概念"属于"在JavaScript中并不存在。事物可以这样建模,但它只是一种约定。)

通过直接致电(obj.foo(1, 2, 3)),this将指向obj。使用callapplythis将指向您想要的任何对象。这比起初听起来更有用。大多数情况下,当您想要动态调用函数时,最终会使用apply

答案 1 :(得分:1)

查看Function.apply:

function test(a, b) { console.log([a, b]) }

test.apply(null, [1, 2]); // => [ 1, 2 ]