JavaScript 闭包和范围



以下是代码:

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。希望你能帮我解决问题。

foobar不共享相同的xx在调用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());

你需要调用第一个函数一次,并在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

当 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

这两个

是同一个调用,因此在调用它们时2

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

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

相关内容

  • 没有找到相关文章

最新更新