从Javascript中的另一个函数访问一个局部变量与闭包?

时间:2017-04-11 15:19:02

标签: 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。

2 个答案:

答案 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)