局部变量
对于局部变量, JS 给出的定义是这样的: 在 JavaScript 函数内部声明的变量 (使用 var) 是局部变量, 所以只能在函数内部访问它.(该变量的作用域是局部的). 可以在不同的函数中使用名称相同的局部变量, 因为只有声明过该变量的函数才能识别出该变量. 只要函数运行完毕, 本地变量就会被删除.
我们先来逐步理解:
只能在函数内部访问
- function test() {
- var a = 0;
- return a;
- }
- console.log(a);
- // 结果: a is not defined
上面的代码声明了一个 test()函数, 在函数内部声明了一个局部变量 a, 当我们尝试在函数外访问局部变量 a 时, 出来的结果是 a is not defined
我们再来看下面这个例子:
- function test() {
- var a = 0;
- return a;
- }
- console.log(test());
- // 结果: 0
以上两个例子很好的阐述了局部变量只能在函数内部访问, 当调用函数时, 函数域自动执行其中的代码, 局部变量自然也被调用.
只要函数运行完毕, 本地变量就会被删除
- function b() {
- var y = 0;
- z = ++y;
- console.log("这是局部变量 y:",z)
- return z;
- }
- console.log(b(),b(),b());
- // 结果: 这是局部变量 y: 1
- // 这是局部变量 y: 1
- // 这是局部变量 y: 1
- //1 1 1
从上面代码我们可以看出, 我们执行了 3 次函数调用, 得到的结果都是 1, 可能有人会说, 这很简单啊, 每次出来的结果都是 1, 那是因为每次执行函数, 函数内都会将局部变量 y 初始化为 0. 没错, 的确是这样, 但是如果不初始化变量, 则得到的返回值是 NaN, 所以初始化是必要的. 所以, 无论用什么办法, 在函数内部用一个局部变量去做累加, 是不可能实现的. 但是, 我们可以通过全局变量和闭包来实现累加.
全局变量
在 JS 中, 这样定义全局变量, 在函数外声明的变量是全局变量, 网页上的所有脚本和函数都能访问它. 全局变量会在页面关闭后被删除.
我们再来看一个例子
- var a = 0;
- function b() {
- ++a;
- console.log("这是全局变量 a",a);
- return a;
- }
- console.log("这是未改变的全局变量 a:",a,"这是函数 b():",b(),b(),b(),"这是改变后的全局变量 a:",a);
- // 结果: 这是全局变量 a 1
- // 这是全局变量 a 2
- // 这是全局变量 a 3
- // 这是未改变的全局变量 a: 0 这是函数 b(): 1 2 3 这是改变后的全局变量 a: 3
上面代码定义了一个全局变量 a, 和一个 b()函数, 通过函数内部对 a 执行自加加, 实现了累加目的, 通过三次调用函数, 得到的结果 a 为 3.
闭包
什么是闭包呢? 闭包的定义是这样的, 闭包是一种保护私有变量的机制, 在函数执行时形成私有的作用域, 保护里面的私有变量不受外界干扰. 直观的说就是形成一个不销毁的栈环境.
我对闭包的理解是这样的, 闭包就是一个内嵌函数引用顶层函数的变量, 而顶层函数是一个立即执行函数(自调用函数), 因为它会自动调用, 所以局部变量不会被删除, 但是这会增加内存消耗.
来看一个例子
- function a() {
- var b = 0;
- return function() {
- return ++b;
- }
- }
- var closure = a();
- console.log("这是闭包:",closure(),closure(),closure());
- // 结果: 这是闭包: 1 2 3
我们看到, 由于闭包的特殊机制, 使得局部变量在函数执行完之后不会被销毁, 由此得到的最后结果为 3 , 而不是 1.
来源: https://www.cnblogs.com/ktddcn/p/11937879.html