2016-11-06 234 views
2

我在阅读你不知道JS - 范围和关闭书。说明全球范围

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

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

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

固定这个(污染),他说,包装一个匿名函数中的代码。

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

+1

你已经为匿名函数的图片,它的红线。全局对象/变量在红色蛋之外。 –

+0

围绕除了红色之外的所有内容添加一个圆圈,并将其称为“匿名”。 – leaf

+0

@NinaScholz我不同意,全球变量生活在全球范围内,这是红色的蛋。 – leaf

回答

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

+0

我完全意识到这些图表有多糟糕,但我吮吸艺术。任何类型的艺术。 – vlaz

+1

谢谢你的时间,另一个问题,** a **是全球范围的一部分,当然还有**窗口**。哪些存储在窗口对象中?当你说,console.log(窗口),你可以深入到很多细节,对吧?哪个节点包含我的匿名函数和变量? – Meysam

+0

@Meysam首先,是的 - 如果'var a'在全局范围内声明,那么它将成为'window'对象的一部分。至于你的第二个问题 - 匿名函数将不会被分配给'window'。这是它们有用性的一部分 - 除非你自己指定一个引用,例如'var anon =(function(){/ * code * /})()',否则你将无法访问匿名函数,但是在那个该函数必须具有返回值。此时,您正在接近[模块模式](https://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript)。 – vlaz

0

由于@procrastinator建议,围绕红色的 'A' 和Foo并称之为匿名

0

你可以把它的IIFE

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

 
console.log(a)

希望这有助于

+0

问题是关于图。 –

+0

好吧......我以为他在问怎么做 – Geeky