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

  • 相关阅读:
    Leetcode Binary Tree Level Order Traversal
    Leetcode Symmetric Tree
    Leetcode Same Tree
    Leetcode Unique Paths
    Leetcode Populating Next Right Pointers in Each Node
    Leetcode Maximum Depth of Binary Tree
    Leetcode Minimum Path Sum
    Leetcode Merge Two Sorted Lists
    Leetcode Climbing Stairs
    Leetcode Triangle
  • 原文地址:https://www.cnblogs.com/ktddcn/p/11937879.html
Copyright © 2020-2023  润新知