说明全球范围

时间:2016-11-06 16:01:07

标签: javascript

我正在阅读你不知道JS - 范围和闭包的书。

它说,你不应该污染全球范围。 foo a 正在污染全球范围。例如:

var a = 2;
function foo() {
    var a = 3;
    console.log( a ); // 3
}
foo(); 
console.log( a ); //2

在这个例子中,我想出了一张图片(学习的一部分)。

用于修复此问题(污染),他说将代码包装在一个匿名函数中。

但是,我有问题说明这一点。你能帮我这个吗?说明它很重要。

3 个答案:

答案 0 :(得分:1)

我希望这会有所帮助。这是另外具有匿名功能的示例。

var a = 2;
console.log("global (start):", a); //2

(function() {
  var a = 42;
  console.log("inside anonimous function (start):", a); //42
  
  function foo() {
    var a = 3;
    console.log("inside foo():", a); //3
  }

  foo();
  console.log("inside anonimous function (end):", a); //42
})()

console.log("global (end):", a); //2

图像并不是最好的,但我希望它能说明示波器是如何嵌套的。

illustration of scopes

因此,您可以看到每个范围都有自己的变量a,并且不会触及其余部分。这是因为每个都使用var a来声明它。如果省略var部分,则将使用外部作用域中的变量

var foo = 1;
console.log("global (start)", foo);

function bar() {
  console.log("inside bar(), before modification:", foo);
  foo = 7;
  console.log("inside bar(), after modification:", foo);
}

bar();
console.log("global (end)", foo);

enter image description here

答案 1 :(得分:0)

正如@procrastinator建议的那样,包围红色'a'和foo并将其称为匿名

答案 2 :(得分:0)

你可以把它变成IIFE



(function foo() {
    var a = 3;
    console.log( a ); // 3
})();

 console.log( a )




希望这有帮助