2012-06-22 133 views
1

我看着这个:Returning values from nested functions in Javascriptjavascript变量作用域:从嵌套函数返回变量?

但它并没有真正帮助我(或者我太愚蠢得到它)。

我的变量范围有点关闭,我不明白为什么。我的alert()行为不如预期。试图在所有行上添加评论以解释我在想什么。

非常感谢任何意见/指针/答案!

var g = {};/is a large object with all kinds of other stuff and functions in it 

g.ding = function(){ // my problem function 
var baby = 'young'; // i thought I set a local var here 
    if(someVar==true) { // standard issue if statement 
     someAPI.class(// using an API that uses a function as its attribute 
      function(stuff){ // my anonymous function 
       baby = 'old'; // setting the var to something 
      } 
     ); 
    } 
    return baby; // returning the var 
} 

alert(g.ding()); // i expect it to say "old" but it keeps saying "young". why? 

新的编辑: 娟的接受的答案是伟大的,但是是不是还有用的setTimeout()处理异步函数调用,并从根本上让他们同步的方法吗?如果读过这些的人知道我想知道的答案。谢谢。

+0

最有可能的是,因为'function(stuff)'永远不会运行。你的范围看起来很好。这里没有任何东西证明设置'baby =“old”'的代码行已经执行完毕。 'someVar'可能是错误的,或者'someAPI'永远不会调用你传递它的函数。 –

+0

好吧,我最初确实用alert()函数调用了这个函数。我认为API函数的异步元素是解决方案。 – tim

回答

6

someAPI.class(function(){})的调用可能是异步的,这意味着当someAPI.class()返回并且变量未被更改时,您传递给它的函数可能未被调用。

的解决方案是将变量传递回回调

g.ding = function(callback){ 
    var baby = 'young'; 
    if(someVar) { 
     someAPI.class(
      // There's no guarantee of when this function is called 
      function(stuff){ 
       baby = 'old'; 
       // Call the callback, it's like a return, for async functions 
       callback(baby); 
      } 
     ); 
    } 
    // the inner function probably wasn't called yet, 
    // doesn't make sense to return this here 
    // return baby; 
} 

// Then you'd call it like this, as soon as you use an async function 
// all the functions that call it have to use callbacks for return values 
g.ding(function(value){ 
    alert(value); 
}); 
+0

感谢一群胡安,这对我来说绝对是清楚的。总是与异步斗争。 – tim

+0

@tim顺便说一句,'class'是一个保留关键字,不应该用作属性名称(除非你总是用'someAPI [“class”]()''我希望这不是方法的真实名称你打电话给 –

+0

胡安,谢谢是的,我知道关于'class' - 为了清楚起见,我简化了代码示例。 – tim

0

在这里,我可以认为你

someAPI.class(); 

必须是一个事件相关的功能(如点击,鼠标悬停等)。所以只有当相关事件发生时才会执行它内部的函数,从而改变变量的值。但我认为事件不会发生,因此变量不会改变。