Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用回调函数或全局函数重新分配存储在闭包中的变量 编辑_Javascript_Closures - Fatal编程技术网

Javascript 使用回调函数或全局函数重新分配存储在闭包中的变量 编辑

Javascript 使用回调函数或全局函数重新分配存储在闭包中的变量 编辑,javascript,closures,Javascript,Closures,让我更直截了当地说。我正在尝试创建一个psuedo承诺实现。这里的想法是,我有一个回调,在收到异步调用之前不会执行。所以我只是将对这个函数的所有调用排队,直到它被通知可以执行为止。队列被清空,对函数的任何进一步调用都应该立即执行,但由于某种原因,函数仍在排队。这是因为,无论出于何种原因,我对runner函数的重新定义无法正常工作。下面的代码是我的睡眠剥夺,沮丧版本的每一个想法,通过我的头脑。以下是实际代码: function Promise(callback){ var queue =

让我更直截了当地说。我正在尝试创建一个psuedo承诺实现。这里的想法是,我有一个回调,在收到异步调用之前不会执行。所以我只是将对这个函数的所有调用排队,直到它被通知可以执行为止。队列被清空,对函数的任何进一步调用都应该立即执行,但由于某种原因,函数仍在排队。这是因为,无论出于何种原因,我对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);​
函数承诺(回调){
变量队列=[]
,callback=callback
,runner=函数(){
queue.push({
背景:这,,
args:Array.prototype.slice.call(参数,0)
});
}
;//var
runner.exec=函数(){
对于(var i=0,ilen=queue.length;i


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

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() + '::');
window.test=函数temp(){
var val=7,
func=函数(){
返回val;
};
window.change=函数(){
window.test.val=555555;
$(“更改”+val+“为”+window.test.val+
'')。附加到($输出);
val=window.test.val;
temp.val=window.test.val;
func=函数(){
返回“为什么这不起作用?”;
}
}
返回func();
}
变量$output=$(“#output”);
$('').appendTo($output.html('::'+test()+'::');
window.change();
$('').appendTo($output.html('::'+test()+'::');

您试图引用语法为
func.varname
的函数中的局部变量。这是行不通的,局部变量不是这样工作的。

您试图在语法为
func.varname
的函数中引用局部变量。那不行,局部变量不是这样工作的。

第二次调用
test
时,您正在创建一个名为
func
的新局部变量,并定义一个新的
窗口。更改关闭该新变量的
。通过调用原始
窗口对原始
func
所做的更改。更改在第二次调用中不相关

还请注意以下行:

window.test.val = 555555;

…不修改/引用外部函数中的
val
变量
window.test.val
是指
test
对象(恰好是函数)上名为
val
的属性,没有任何局部变量。

第二次调用
test
时,您正在创建一个名为
func
的新局部变量,并定义一个新的
窗口。更改关闭该新变量的
。通过调用原始
窗口对原始
func
所做的更改。更改在第二次调用中不相关

还请注意以下行:

window.test.val = 555555;

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

我最终创建了一个执行此操作的函数。其要点如下:

它是这样工作的

您通过调用延迟传递要延迟其功能的回调:

var deferredCB = Defer(function(){ console.log(this,arguments) };
deferredCB现在将存储您传递的所有参数,以便在以后某个日期执行这些参数:

defferedCB(1);
defferedCB(2);
现在,当您准备好执行操作时,只需“执行”延迟CB:

defferedCB.exec();
其结果是:

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

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


多田

我终于创建了一个函数来执行这个操作。其要点如下:

它是这样工作的

您通过调用延迟传递要延迟其功能的回调:

var deferredCB = Defer(function(){ console.log(this,arguments) };
deferredCB现在将存储您传递的所有参数,以便在以后某个日期执行这些参数:

defferedCB(1);
defferedCB(2);
现在,当您准备好执行操作时,只需“执行”延迟CB:

defferedCB.exec();
其结果是:

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

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


多田

我要把你的代码移到这里。请始终在此处包含代码。我将把您的代码移到此处。请始终在此处包含代码。