我发现了我已实现的这个主题(参见接受的答案):
javascript等同于PHP的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';
Run Code Online (Sandbox Code Playgroud)
后来,我这样打电话给他们:
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);
}
Run Code Online (Sandbox Code Playgroud)
我没有必要使用数组来做到这一点.我不懂JS OOP(尚未尝试过),虽然我对PHP OOP很满意,所以我不知道是否有办法在那里做到这一点.
任何有关传递多个参数的帮助都将受到赞赏.
谢谢.
Tom*_*lak 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);
Run Code Online (Sandbox Code Playgroud)
call
并且apply
是相似的.它们让您决定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); }
};
Run Code Online (Sandbox Code Playgroud)
这意味着您可以使用点表示法访问对象属性:
// direct function call
obj.foo(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
或者通过方括号表示法(注意对象键是字符串):
var funcName = "foo";
obj[funcName](1, 2, 3);
obj[funcName].call(obj, 1, 2, 3);
obj[funcName].apply(obj, [1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)
方括号表示法使您可以自由地动态选择对象属性.如果此属性恰好是一个函数,apply()
则可以自由地动态选择函数参数.
未声明为某个对象属性的每个顶级函数都将成为全局对象的属性.在浏览器中,全局对象是window
.(所以function foo()
我上面的第一个代码块真的是window.foo
.)
请注意,this
这在PHP中不起作用.它将指向调用函数的对象,而不是函数"属于"的对象.("属于"这个概念在JavaScript中并不存在.事物可以通过这种方式建模,但它只是一种约定.)
使用直接调用(obj.foo(1, 2, 3)
),this
将指向obj
.使用call
和apply
,this
将指向您想要的任何对象.这比起初听起来更有用.大多数情况下,当您想要动态调用函数时,最终会使用apply
.
归档时间: |
|
查看次数: |
3530 次 |
最近记录: |