我是新来的。我有一个困扰我的问题。我想知道是否有人能指出我正确的方向。我有以下代码。
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 :(得分:0)
让它在控制台中打印的最简单方法就是简单地删除" var"在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();
答案 1 :(得分: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 (即this.myValue),那么您可以使用 call 或 apply 只是将另一个范围推入func2,但是在你的问题中给出的确切示例中,将变量 myValue 推入全局范围是我能想到的最简单的解决方案。
注意:将变量推入全局范围会有所不同,具体取决于您是否在浏览器中运行(例如node.js)