1

编辑

让我更深入一点。我正在尝试创建一个伪承诺实现。这里的想法是我有一个回调,在收到异步调用之前不会执行。所以我只是将所有对这个函数的调用排队,直到它被通知可以执行。队列被清空,任何对该函数的进一步调用都应该立即执行,但由于某种原因,该函数仍在排队。这是因为,无论出于何种原因,我对 runner 函数的重新定义都无法正常工作。下面的代码是我脑海中每一个想法的睡眠不足、沮丧的版本。这是实际的代码:

function Promise(callback){
  var queue    = []
    , callback = callback
    , runner   = function(){
        queue.push({
          context: this,
          args: Array.prototype.slice.call(arguments, 0)
        });
      }
  ;//var

  runner.exec = function(){
    for(var i = 0, ilen = queue.length; i < ilen; i++){
      var q = queue[i];

      callback.apply(q.context, q.args);
    }

    runner = callback;
  };

  return runner;
}

test = Promise(function(){
  $('<div/>').appendTo('#output').html(Array.prototype.slice.call(arguments,0).toString());
});

test(1,2);
test(3,4);
test.exec();
test(5,6);​

http://jsfiddle.net/a7gaR/


我正用这个把头撞在墙上。我正在尝试通过函数本身外部的调用重新分配函数中的变量(理想情况下,通过将重新分配函数作为回调传递)。在我在 jsfiddle 上发布的示例中,我创建了一个全局函数,理论上,它引用了其父函数中包含的变量。在调用该外部函数时,我希望它重新分配另一个函数正在使用的值。它似乎不以这种方式工作。

window.test = function temp() {
    var val = 7,
        func = function() {
            return val;
        };

    window.change = function() {
        window.test.val = 555555;
        $('<div>Changing ' + val + ' to ' + window.test.val + 
               '</div>').appendTo($output);
        val = window.test.val;
        temp.val = window.test.val;
        func = function() {
            return 'Why isn\'t this working?';
        }
    }

    return func();
}

var $output = $('#output');

$('<div/>').appendTo($output).html('::' + test() + '::');
window.change();
$('<div/>').appendTo($output).html('::' + test() + '::');

http://jsfiddle.net/YhyMK/

4

3 回答 3

1

第二次调用时,test您将创建一个名为的局部变量func并定义一个关闭该新变量的新变量 window.changefunc通过调用原件对原件所做的更改window.change与第二次调用无关。

另请注意以下行:

window.test.val = 555555;

...不修改/引用val外部函数中的变量。window.test.val指的是在对象上命名valtest属性(恰好是一个函数),而不是任何局部变量。

于 2012-06-30T02:04:00.300 回答
0

我终于创建了一个可以执行此操作的函数。它的要点在这里:https ://gist.github.com/2586972 。

它像这样工作......

您调用 Defer 传递您想要延迟其功能的回调:

var deferredCB = Defer(function(){ console.log(this,arguments) };

deferredCB 现在将存储您传递的所有参数,以便在以后执行它们:

defferedCB(1);
defferedCB(2);

现在,当您准备好执行操作时,您只需“执行”deferredCB:

defferedCB.exec();

结果是:

// window, 1
// window, 2

所有未来对 deferredCB 的调用都将立即执行。现在我正在考虑它,我可能会进行重写以允许您将 deferredCB 重置为其预执行状态(再次存储所有参数)。

让它工作的关键是有一个包装函数。Javascript 根本不允许您在执行函数时重新分配它。

田田!!!

于 2012-10-01T13:58:42.383 回答
0

您正在尝试使用语法来引用函数中的局部变量func.varname。那是行不通的,这不是局部变量的工作方式。

于 2012-06-30T01:42:51.513 回答