2017-02-01 88 views
1

这里是代码: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应该保持函数的范围,所以我认为foo和bar具有相同的x。希望你能帮我解决问题。

回答

1

foobar不共享相同的x。当调用fn时,x被创建。因此,每个致电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());

0

由于变种X创建一个私有变量,它重新每次FN创建() 被安排了。如果你想让它结转,只需更改变种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

+0

我很困惑。这里应该提到的是什么?它将在严格模式下为undefined,否则为窗口对象。这与声明全局'x'变量相同。另外,我想你的意思是“每次fn()'都被**调用**,而不是”赋值“ –

+0

'this.x'会使'x'全局,就好像'x'被定义在' fn'(全球),所以我们不再谈论关闭了, –

+0

是的,我正在修补,意识到你是绝对正确的。 – Snowmonkey

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

0

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

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

两个设置var x=1私人。因此,当您再次呼叫它们时foo(); //3内部函数fn2是用增量语句调用的函数