对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. Java一般命名规范

    一.项目名称 最好用英文,所有单词全部用小写,如testjavaproject.studentmanagement等,当然也也可以用中文,如"学生管理系统"等. 二.Java pr ...

  2. OpenGL渲染管道,Shader,VAO&VBO&EBO

    OpenGL渲染管线 (也就是)OpenGL渲染一帧图形的流程 以下列举最简单的,渲染一个三角形的流程,你可以将它视为 精简版OpenGL渲染管线 更复杂的流程也仅仅就是:在此基础上的各个流程中 添加 ...

  3. 设置自启动nginx(适用于其他软件)(LinuxDeploy里的Ubuntu)

    LinuxDeploy里的Ubuntu自启动nginx(适用于其他软件) 网上的教程是这样的,基本能用 1.编写脚本(这个文件及其内容安装Nginx后自动生成,没有的话内容自己Google) $ su ...

  4. 5ucms静态发布卡住解决办法

    找到admin/admin_createhtml.asp文件(admin目录为你的后台管理目录),讲下面这段代码删掉保存即可. <script language="JavaScript ...

  5. 看完小白也会使用,Android投屏神器scrcpy详细教程

    楔子 做为一个软件测试工程师,在使用手机测试的时候,缺陷附件想附上截图.视频,需要从手机把图片.视频发送到拷贝或发送到电脑,非常麻烦. 所以想到使用投屏软件,把手机的屏幕投屏到电脑,便可以直接在电脑上 ...

  6. Ajax与Gson

    1. ajax的底层操作方法: 代码get请求  Get请求 2. Post请求 $("#chufa").click(function () { var val = $(" ...

  7. verifycode验证码模版

    # -*- coding:utf-8 -*- from django.shortcuts import HttpResponse def verifycode(request): # 引入绘图模块 f ...

  8. selenium+python处理Alert弹窗

    from selenium import webdriver import win32api import win32con from time import sleep driver = webdr ...

  9. 修改为阿里的yum源

    如果没有wget,先安装一个.(如果有请蹦过) yum install wget -y 备份本地yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r ...

  10. [转载]SELinux安全系统基础

    链接:http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/26/3100444.html 本篇随笔将记录一下学习SELinux的一些心得与体 ...