function foo(a){ var b = 2; // ... function bar(){ // ... } // ... var c = 3; }
foo 的作用域气泡中包含了标识符 a、b、c 和 bar
function doSomething(a){ b = a + doSomethingElse(a*2); console.log(b*3) } function doSomethingElse(a){ return a - 1; } var b; doSomething(2); // 15
function doSomething(a){ function doSomethingElse(a){ return a - 1; } var b; b = a + doSomethingElse(a*2); console.log(b*3) } doSomething(2); // 15
function foo() { function bar(a){ i = 3; console.log( a + i ); } for(var i=0; i<10; i++){ bar( i * 2 ); // 糟糕,无限循环了 } } foo()
function foo() { function bar(a){ var i = 3; console.log( a + i ); } for(var i=0; i<10; i++){ bar( i * 2 ); } } foo()
bar 内部的赋值操作需要声明一个本地变量来使用。这样就可以,根据作用域规则。另外一种方式是不要用 i 这个名字