2017-04-11 51 views
0

我是新来的。我有一个困扰着我的问题。我想知道是否有人可以指出我正确的方向。我有以下代码。从Javascript中的另一个函数访问本地变量与闭包?

var f1 = function() { 

    var myValue = 3; 

    setTimeout((function(myValue){ 
    return function() { 
     f2(); 
    }; 
    })(myValue), 1000); 

}; 

var f2 = function() { 
    console.log(myValue); 
} 

f1(); 

我得到myValue未定义。我在这里错过了什么?如何在f2中访问myValue而不将其设为全局或作为参数传递?提前致谢。

----附加信息----

为什么我问到这个问题,因为我有这个一个面试问题的原因。鉴于以下功能:

var func1 = function() { 
    var myValue = 3; 
    setTimeout(func2, 1000); 
}; 

var func2 = function() { 
    console.log(myValue); 
}; 

func1(); 

不移动的功能或添加参数的功能,只改变里面有什么FUNC1。如何在console.log中获取myValue打印。

+0

将它作为参数调用'从f2'是不同的'f1' –

+0

如果您可以使用localStorage,请将localStorage中的值设置为f1,然后从f2中的localStorage中读取它。 –

+0

阅读JS中的变量作用域。 – Slime

回答

0

最简单的方法得到它的控制台,这是您的要求,是简单地删除FUNC1的“变种”打印。这样可以将myValue推入全局范围。在现实世界中,你不会认为这是一个很好的解决方案,但它解决了这个问题。如果你得到这份工作,你欠我一杯啤酒。你应该选择我的答案。 :)

var func1 = function() { 
    myValue = 3; 
    setTimeout(func2, 1000); 
}; 

var func2 = function() { 
    console.log(myValue); 
}; 

func1(); 


以前的答案如下:

你的函数f2是不是在相同的范围内myvalue的。您可以F1中定义它像这样,它会工作:

var f1 = function() { 

    var myValue = 3; 

    var f2 = function() { 
    console.log(myValue); 
    } 

    setTimeout((function(myValue){ 
    return function() { 
     f2(); 
    }; 
    })(myValue), 1000); 
}; 

f1(); 
+0

但是,感谢您的回复,我无法移动该功能。请检查我的附加信息。 –

0

这里有一个办法做到这一点,根据您的澄清:

var func1 = function() { 
 
    var myValue = 3; 
 
    window.myValue = myValue; /* Push it into the global scope, assuming you're running in a browser */ 
 
          /* If you're running elsewhere (e.g. node.js) there are similar options */ 
 
    setTimeout(func2, 1000); 
 
}; 
 

 
var func2 = function() { 
 
    console.log(myValue); 
 
}; 
 

 
func1();

说明:或者,如果你使用这个(即this.myValue),那么你可以使用像这样的机制调用适用只是另一个推入范围FUNC2,但在你的问题给出推可变myvalue的到全球范围内的确切的例子是我能想到的最简单的解决方案。

注:推变量纳入全球范围取决于不管你是在浏览器中运行,或者没有(如Node.js的)

+0

感谢您的回复,但是我无法移动这些功能。 –

+0

@WilliamNg根据您的澄清更新了解决方案并提供了解决方案 – Ciabaros

相关问题