让我更多地了解这一点。我正在尝试创建一个psuedo promise实现。这里的想法是我有一个回调,直到收到异步调用才会执行。所以我只是将所有对此函数的调用排队,直到通知它可以被执行的时间。队列被清空,并且对函数的任何进一步调用都是SUPPOSED立即执行,但由于某种原因,该函数仍在排队。这是因为无论出于何种原因,我对转轮功能的重新定义都无法正常工作。下面的代码是我的睡眠剥夺,每一个想法的沮丧版本通过我的脑袋。这是实际的代码:
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);
我用这个把头撞在墙上。我试图从函数本身之外的调用重新分配函数中的变量(理想情况下通过将重新分配函数作为回调传递)。在我在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() + '::');
答案 0 :(得分:1)
第二次致电test
时,您正在创建名为func
的新本地变量,并定义新 window.change
关闭那个新变量。您通过调用原始func
对原始window.change
所做的更改与第二次调用无关。
另请注意以下一行:
window.test.val = 555555;
...不修改/引用外部函数中的val
变量。 window.test.val
引用val
对象上的test
属性(恰好是函数),而不是任何局部变量。
答案 1 :(得分:0)
您正尝试使用语法func.varname
引用函数中的局部变量。这不会起作用,这不是局部变量的工作方式。
答案 2 :(得分: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只是不允许你在执行函数时重新分配函数。
TADA !!!