[英]JavaScript closure and scope
以下是代碼:
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。希望你能幫助我解決這個問題。
foo
和bar
不共享相同的x
。 當調用fn
時創建x
。 因此,每次調用fn
都會創建一個全新的x
,品牌定義的函數fn2
可以訪問該x
,並將其返回。
要檢查foo
和bar
不共享相同的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
foo(); //3
內部函數fn2
是使用增量語句調用的函數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.