为什么闭包比JavaScript中的全局变量更安全?

Jay*_*Sky 1 javascript closures scope

我对编程很新,但却无法理解一些基本概念.

我正在阅读这篇文章http://www.w3schools.com/js/js_function_closures.asp(我从另一个w3schools页面重定向到那里告诉我'避免全局变量').

但是,我无法真正理解闭包如何"击败"全局变量.

从我所看到和读到的,全局变量是危险的,因为任何脚本或用户都可以修改它们可能破坏代码功能.

无论如何 - 如果我们考虑来自链接的代码:

var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
Run Code Online (Sandbox Code Playgroud)

如果我们考虑全局变量:

var counter = 0;
function add(){
counter = counter+1;
return counter;
}
Run Code Online (Sandbox Code Playgroud)

脚本比第二种情况更难以获取第一种情况?在两种情况下都不需要一行代码来改变变量吗?我唯一想到的就是在另一个函数中声明闭包,它会被执行,所以它只能在本地访问:

function exec(){

var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();

console.log(add());
}
Run Code Online (Sandbox Code Playgroud)

但我认为这不会起作用.

Chr*_*ung 5

在第一种情况下,函数外部的代码add不能触及计数器.它们可以单独创建一个counter变量,但它与计数器使用的变量不同add,并且不会影响它的运算add.

在第二种情况下,触及全局的任何代码counter都能够影响其add操作.