zoukankan      html  css  js  c++  java
  • 对JavaScript中局部变量、全局变量和闭包的理解

    对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。

  • 相关阅读:
    命令行选项
    损坏的RAID5
    Codeforces Round #600 (Div. 2)
    python 数据分析
    xor or and 线段树
    CCPC哈尔滨E题
    二维偏序
    Codeforces Round #592 (Div. 2)
    Codeforces Round #597 (Div. 2)
    pycharm 安装激活
  • 原文地址:https://www.cnblogs.com/ktddcn/p/11937879.html
Copyright © 2011-2022 走看看