当你在函数上调用“apply”时,函数对象本身就是调用“apply”的“this”,所以你可以这样做:
function test(s) { alert(""+s); }
Function.prototype.apply.call(setTimeout, null, [test, 0, 'abc']);
// Note: same as "setTimeout.apply(null, [test, 0, 'abc']);" in supported browsers.
基本上,我们是在强制使用 ofFunction.prototype.apply
而不是试图寻找一个不存在的setTimeout.apply
. 在 to 的参数中call
,第一个参数是我们想要运行的函数apply
(在这种情况下是对象上下文setTimeout
)。接下来是传递给 的参数,其中第一个是函数将在其下运行apply
的期望(在这种情况下为'null',因为不允许上下文值),以下是参数数组传递给我们要运行的函数。this
setTimeout
this
这在 IE7+ 中有效,除了 IE7 不传递自定义参数(即本例中的“abc”,它将提示“未定义”)。
这是一个 TypeScript 实现:
/** Helps support cases where 'apply' is missing for a host function object (i.e. IE7 'setTimeout', etc.). This function
* will attempt to call '.apply()' on the specified function, and fall back to a work around if missing.
* @param {Function} func The function to call '.apply()' on.
* @param {Object} _this The calling object, which is the 'this' reference in the called function (the 'func' argument).
* Note: This must be null for special host functions, such as 'setTimeout' in IE7.
* @param {any} args The arguments to apply to given function reference (the 'func' argument).
*/
function apply(func: Function, _this: Object, args: any[]): any {
if (func.apply) {
return func.apply(_this, args);
} else {
return Function.prototype.apply.call(func, _this, args);
}
}
...和一个基本的 JavaScript:
function apply(func, _this, args) {
if (func.apply) {
return func.apply(_this, args);
} else {
return Function.prototype.apply.call(func, _this, args);
}
}