首先要做的事情:废弃整个代码,重新开始。你的方法不会让你到达你想去的地方。 (不幸的是,我无法告诉你你想去哪里,因为我无法理解你的例子。)
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);
call
and 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); }
};
这意味着您可以使用点符号访问对象属性:
// 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()
让您可以自由地动态选择函数参数。
每个尚未声明为某个对象的属性的顶级函数都将成为该对象的属性global目的。在浏览器中全局对象是window
。 (所以function foo()
在我上面的第一个代码块中确实是window.foo
.)
注意this
不像 PHP 那样工作。它将指向该函数的对象已被召唤,而不是函数“所属”的对象。 (“属于”这个概念在 JavaScript 中并不真正存在。事物可以用这种方式建模,但这只是一个约定。)
直接调用(obj.foo(1, 2, 3)
), this
将指向obj
. With call
and apply
, this
将指向您想要指向的任何对象。这比乍听起来有用得多。大多数时候,当你想动态调用函数时,你最终会使用apply
.