对js中局部变量、全局变量和闭包的理解

局部变量

对于局部变量,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。

对JavaScript中局部变量、全局变量和闭包的理解的更多相关文章

  1. 对js中局部变量、全局变量和闭包的理解

    对js中局部变量.全局变量和闭包的理解 局部变量 对于局部变量,js给出的定义是这样的:在 JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域 ...

  2. JavaScript中局部变量与全局变量的不同

    JavaScript中局部变量与全局变量 我们知道,JavaScript的变量是松散型的变量,也就是说,其变量只需用var声明,其赋值的类型是不限定的.比如: var person=18; perso ...

  3. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

  4. JavaScript this 局部变量全局变量 作用域 作用域链 闭包

    从阮老师博客的一道测试题说起: 代码段一: var name = "The Window"; var object = { name : "My Object" ...

  5. javascript中的原型和闭包

    定义 //闭包测试 function bbTest() { var local = "这里是本地变量"; //闭包会扩大局部变量的作用域,具备变量一致会存活到函数之外,在函数之外可 ...

  6. JSON 在JavaScript 中的应用及自己的理解

    [对象和json]JSON:JavaScript 对象表示法(JavaScript Object Notation).JSON 是存储和交换文本信息的语法.类似 XML.JSON是一种数据格式,不是一 ...

  7. JavaScript中对null和undefined的理解

    前沿: 今天工作中遇到了监视一个变量是undefined,结果判断写的是==null 返回值是true,这个结果引起了我对这两个东西的兴趣. 查询了相关的文章理解并测试了.发现有以下特点: 1.广义上 ...

  8. 总结javascript中的全局变量和局部变量的区别以及声明函数和调用函数的区别

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8&quo ...

  9. JavaScript中的函数:闭包,this,高阶函数

    一.函数基本理论 function compare(val1,val2){ return val1 - val2; }var result = compare(5,10); 1,函数的定义没什么意义, ...

随机推荐

  1. xshell与小键盘问题

    有些程序员的键盘是带有小数字键的,在使用xshell中文版时就可能出现一些小状况,本集就同大家分析一下使用数字键盘出现乱码的情况怎么办. 图1:使用数字小键盘出现乱码 问题描述: 在xshell上用v ...

  2. Java数学函数的使用

    Java的Math类中提供了一系列关于数学运算的静态方法,常见的运算整理如下[1] 算数运算 Math.sqrt() // 平方根 Math.cbrt() // 立方根 Math.pow(a, b) ...

  3. 5.10学习总结——Activity的跳转和传值

    使用sharedpreference是对信息的存储,也可以进行传值,今天通过查找资料,学习了Activity的跳转和传值方法. 跳转 1.显示跳转 4种方法 1 2 3 4 5 6 7 8 9 10 ...

  4. CPU到底是什么东西?它为什么能够执行数学运算?

    CPU到底是什么东西?它为什么能够执行数学运算? 本文地址http://yangjianyong.cn/?p=20转载无需经过作者本人授权 简单的物理电路 先来看一张初中学过的物理电路图: 从图中我们 ...

  5. 还不知道PHP有闭包?那你真OUT了

    做过一段时间的Web开发,我们都知道或者了解JavaScript中有个非常强大的语法,那就是闭包.其实,在PHP中也早就有了闭包函数的功能.早在5.3版本的PHP中,闭包函数就已经出现了.到了7以及后 ...

  6. Linux系列(1) - 使用Hyper-V安装Linux系统

    前言 使用工具:Hyper-V,补充:hyper-v是一项技术,而vmware是一款软件.具体区别自行百度 LINUX版本:CentOS-8.4.2105-x86_64-dvd1.iso Window ...

  7. Jmeter系列(3) - 静默压测

    前言 Windows环境 简述 静默 : 脱离UI运⾏JMeter压测,用命令行方式运行性能测试脚本好处:命令运⾏更容易"搞事情"命令格式: jmeter –n –t $jmx_f ...

  8. python编码问题:UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 68: illegal multibyte sequence

    import yaml def test_yaml(): f = open('C:\hogwarts\Scripts\hogwarts-api\demo\yaml_data.yml') print(y ...

  9. genymotion从本地拖拽apk到模拟器失败,报错“An error occured while deploying the file……”-解决方案

    前两篇已经讲过genymotion的安装了,但genymotion构建的安卓模拟器的界面比较简洁,什么软件都没.那么我们进行测试之前,先将需要测试的apk安装到模拟器中,一般来说,直接将apk文件从本 ...

  10. shell脚本在CentOS7自动更包

    手动更包有些繁琐,就想着用脚本自动更包,后来试了下,最后成功啦! 以下是根据实际项目编写的: 操作环境:centos7.0 tomcat版本:7.0.78 以下为项目存放目录如下: updatefil ...