JavaScript闭包和范围

时间:2017-02-01 17:43:10

标签: javascript scope closures

以下是代码:



function fn() {
  var x = 1;

  function fn2() {
    x++;
    console.log(x);
  }
  return fn2;
}
var foo = fn();
var bar = fn();
foo(); //2
bar(); //2  
foo(); //3




我遇到了一个问题,我无法弄清楚为什么结果不是2 3 4 。我的意思是,根据封闭原则,foo和bar应该保持范围功能 fn ,所以我觉得foo和bar有相同的 x 。希望你能帮我解决问题。

4 个答案:

答案 0 :(得分:1)

foobar不共享相同的x。调用x时会创建fn。因此,每次拨打fn都会创建一个全新的x,可以通过将返回的品牌定义函数fn2进行访问。

要检查foobar是否共享相同的x,请举例说明:

function fn() {
  var x = 1;

  function fn2() {
    x++;
    return x;
  }
  return fn2;
}
var foo = fn();
var bar = fn();
console.log("foo: " + foo());
console.log("bar: " + bar());
console.log("foo: " + foo());
console.log("foo: " + foo());
console.log("foo: " + foo());
console.log("foo: " + foo());
console.log("bar: " + bar());

答案 1 :(得分:1)

你需要调用第一个函数并在x上构建一个闭包,然后返回一个带有函数的函数。



var fn = function () {        
    var x = 1;
    return function () {
        return function () {
            x++;
            console.log(x);
        };
    };
}();

var foo = fn();
var bar = fn();
foo(); //2
bar(); //3  
foo(); //4




答案 2 :(得分:0)

当var x创建一个私有变量时,每次分配fn()时都会重新创建它。如果您希望继续使用,只需将var x更改为this.x:

fn = (function() {
  this.x = 1;

  function fn2() {
    this.x++;
    console.log(this.x);
  }
  return fn2;
});
var foo = fn();
var bar = fn();
foo(); //2
bar(); //3  
foo(); //4

答案 3 :(得分:0)

这两个是相同的调用,因此当你调用它们时2

var foo = fn();
var bar = fn();

两者都私下设置var x=1。因此,当您再次调用它们foo(); //3时,内部函数fn2是使用递增语句调用的函数