jsp页面中如何使用javascript中定义的全局变量_浅析JS中变量的作用域

前言

要理解闭包,首先必须理解JavaScript的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。在JavaScript中函数可以直接读取外部的全局变量。

全局变量

全局变量:可以在任意位置访问的量就叫全局变量
 var age = 20;
 function a(){
     console.log(age);
 }
 a(); >>20

jsp页面中如何使用javascript中定义的全局变量_浅析JS中变量的作用域_第1张图片

局部变量

局部变量:函数中用var定义的变量,只能在函数中访问这个变量,函数外部访问不了。
function a(){
    var age = 20;
}
a();
console.log(age); >> Uncaught ReferenceError: age is not defined

jsp页面中如何使用javascript中定义的全局变量_浅析JS中变量的作用域_第2张图片

特别注意:

这里有一个问题需要注意,函数内部声明变量的时候,一定要使用var声明,如果不使用var声明,实际上是一个全局变量。

function fun2(){
  a="你好";
}
fun2();
alert(a);//"你好"

■ 如何从外部读取局部变量

方法一:return

作用域链:子对象会一级一级地向上寻找所有父对象的变量(兄弟变量)

当我们需要获取到函数内部的变量的时候,我们就需要在函数的内部在定义一个函数。

function fun1(){
  var a="你好";
  function fun2(){
    alert(a);//"你好"
  }
  return fun2();
}
fun1();

在上面的代码中,函数fun2() 就被包括在函数fun1() 内部,这时fun1() 内部的所有局部变量,对fun2都是可见的。

但是反过来就不行,fun2内部的局部变量,对fun1就是不可见的。这就是Javascript语言特有的"作用域链"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。

所以,父对象的所有变量,对子对象都是可见的,反之则不成立。既然fun2可以读取fun1中的局部变量,那么只要把fun2做为返回值就可以获取到fun1中的变量了。那么函数fun2就可以成为闭包了。

再举例:子函数访问上级函数

function a(){
    var name = "jianan";
    function b(){
         console.log(name);
     }
    b();
}
a(); >> "jianan"

jsp页面中如何使用javascript中定义的全局变量_浅析JS中变量的作用域_第3张图片

方法二:自调用函数

函数的另外一种调用形式,你可以把它叫做自调用,自己调用自己,达到自执行的效果。常用在闭包。
var a = 0;
(function(){
   console.log(++a);
})();
>>1

655e9d394b577ce5e4b8b44c4a7281eb.png
  • 这种方式用()把内容包裹起来,后面的()表示立即执行这个函数

可能你会问为什么要把函数包起来?

  • 如果不包裹起来,Js会把它当作函数声明来处理,如果包裹起来就是表达式

总结

  • 在函数中如果不使用var定义变量那么js引擎会自动添加成全局变量。
  • 全局变量从创建的那一刻起就会一直保存在内存中,除非你关闭这个页面
  • 局部变量当函数运行完以后就会销毁这个变量,假如有多次调用这个函数它下一次调用的时候又会重新创建那个变量,既运行完就销毁,回到最初的状态
简单来说局部变量是一次性的,用完就扔,下次要我再重新创建。

回收机制与变量引用

  • JavaScript中有回收机制,如果函数没有被引用,那么等函数执行完以后这个函数的作用域就会被销毁
  • 如果一个函数被其他变量引用,这个函数的作用域将不会被销毁(简单来说就是函数里面的变量会被保存下来,你可以理解成全局变量)

函数的相关知识点:

  • 一个函数内可以嵌套多个函数
  • 函数里面的子函数可以访问它上级定义的变量,注意不只是一级,如果上级没有会继续往上级找,直到找到为止,如果找到全局变量到找不到就会报错。

你可能感兴趣的:(jsp页面中如何使用javascript中定义的全局变量_浅析JS中变量的作用域)