使用jQuery.when时奇怪的变量初始化

时间:2013-11-28 23:15:52

标签: javascript jquery

我发现这非常违反直觉:

var bar = 2;
$.when(function(){bar = 1}).then(function(){
  console.log('print ' + bar)
})
// => print 2

它在控制台中返回2而不是1.但是,只有在function(){bar=1}被解析后才应该执行的回调(即bar = 1)? bar也被声明为全局变量。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这是一种幻觉。

使用此语法,anon函数function(){bar = 1} 实际上未执行。根据{{​​1}}的文档,如果其中一个参数不是一个promise,那么它将被视为一个已经使用参数本身作为解析值解析的promise。

也就是说,代码相当于

$.when

您可以检查这实际上是通过使回调执行某些操作并让您的链式成功处理程序接受参数来实现的:

var f = function(){bar = 1};     // obviously not executed yet
var d = $.Deferred().resolve(f); // still not executed

$.when(d).then(function(){
  console.log('print ' + bar)
})

答案 1 :(得分:1)

我认为这会更好地解释它:

var bar = 2;
$.when(function(){bar = 1}).then(function(f){
  f(); // The function is 'resolved' and passed to the `then` as the first argument.
       // The execution happens here, when we explicitly call it.
  console.log('print ' + bar)
})
// print 1