失去了背景。的setTimeout

时间:2015-01-06 18:21:14

标签: javascript

Function.prototype.defer = function(ms) {
    var self = this;

    return function() {
        setTimeout(self, ms);
    };
}

function f(a, b) {
    alert(a + b);
}

f.defer(5000)(1, 2); // 3

应该在5秒内显示数字3,但不知何故推断出NaN。

2 个答案:

答案 0 :(得分:3)

defer返回的功能不会带任何参数,因此会忽略12

如果你想使用它们,那么你需要捕获它们并用它们做点什么。



Function.prototype.defer = function(ms) {
    var self = this;

    return function(x, y) {
        setTimeout(self.bind(this, x, y), ms);
    };
}

function f(a, b) {
    alert(a + b);
}

f.defer(5000)(1, 2); // 3




答案 1 :(得分:2)

这是因为您正在传递setTimeout函数,但参数1, 2未绑定到它,因此它调用f时没有参数。< / p>

你可以这样解决:

Function.prototype.defer = function(ms) {
    var self = this;

    return function() {
        var args = arguments,
            context = this;

        setTimeout(function() {
            self.apply(context, args);
        }, ms);
    };
}

function f(a, b) {
    alert(a + b);
}

f.defer(5000)(1, 2); // 3