JavaScript获取Session值、作用域与闭包详解

作者:纸飞机时间:2026-10-23 12:01:57浏览:262

本文详解JavaScript中获取Session值的方法,强调JSP表达式需包裹在引号内。深入解析全局与局部作用域、函数作用域及作用域链机制,并阐述闭包的定义、用途及内存管理注意事项,帮助开发者掌握JS核心概念。

本文通过实例介绍如何在JS页面中获取Session值,并深入解析作用域与闭包的相关知识,供读者参考学习。

在JavaScript中获取Session的值:


var name= "${sessioScope.变量名}";

需要注意的是,必须使用双引号将El表达式包裹起来,否则无法正确获取数据。

在JSP中获取Session的值:

可以直接使用${sessionScope.变量名},在标签内部同样适用。

在JSP中获取URL参数的值:


var name = "<%=request.getParameter("name")%>";//谨记:在""中的表达式‘<%= %>'结尾不能加‘;'号,且只能写一句。
var id = ${param.id};//也具有同样的效果,能用在JS类库中的jQuery语法。

在四大作用域中,各作用域的取值方法基本一致,技巧也是一脉相承的。

以下是关于作用域和作用链的相关笔记:

作用域(scope):指对特定变量和方法具有访问权限的代码空间。在JS中,作用域由函数维护,表示变量或函数起作用的区域,即代指它们执行的上下文环境。JavaScript的作用域分为两种:全局作用域和本地作用域,其中本地作用域是按函数划分的。

变量作用域

JavaScript中全局变量的作用域较为简单,它在代码的任何位置都有定义。然而,函数的参数和局部变量仅在函数体内有效。此外,局部变量的优先级高于同名的全局变量,当两者重名时,局部变量会覆盖全局变量(见下方示例)。


var num = 1;      //声明一个全局变量
function func() {
  var num = 2;    //声明一个局部变量
  return num;
}
console.log(num);    //输出:1
console.log(func());  //输出:2

注:声明局部变量时必须使用var关键字,否则解释器会将其视为全局对象window的属性。关于变量的详细笔记地址:原生javascript 学习之js变量全面了解

函数作用域

JavaScript中的变量作用域与C、Java等语言不同,后者具有块级作用域(变量在声明的代码段外不可见)。JavaScript采用的是函数作用域,即变量在声明它们的函数体以及该函数体嵌套的任意函数体内均有定义(见下方示例)。


function func() {
  console.log(num);      //输出:undefined,而非报错,因为变量num在整个函数体内都是有定义的
  var num = 1;        //声明num 在整个函数体func内都有定义
  console.log(num);      //输出:1
}
func();//调用func函数

注:JavaScript的函数作用域意味着在函数内声明的所有变量在函数体内始终可见,即在函数体内变量声明之前就已经可用。

作为属性的变量:

当声明一个全局变量时,实际上是在定义全局对象window的一个属性。


var num = 1;      //声明全变量num
alert(window.num)    //输出:1 声明的全局变量实际上就是声明了一个window对象的属性

作用域链

在JavaScript中,函数也是对象,实际上JS中一切皆对象。函数对象与其他对象一样,拥有可通过代码访问的属性和一系列仅供JS引擎访问的内部属性。其中一个内部属性是[[Scope]],该属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了函数可以访问哪些数据。

当一个函数创建后,它实际上保存了一个作用域链,并且该作用域链会被创建此函数的作用域中可访问的数据对象填充。例如定义如下函数:


function func() {
  var num = 1;
  alert(num);
}
func();

在函数func创建时,其作用域链中会填入一个全局对象,该全局对象包含了所有全局变量,如下图所示(注意:图片仅列举了全部变量中的一部分):

在JavaScript中获取Session的值:

函数add的作用域将在执行时被用到。例如执行如下代码:

执行此函数时会创建一个称为“运行期上下文(execution context)”(也有人称为运行环境)的内部对象,运行期上下文定义了函数执行时的环境。每个运行期上下文都有自己的作用域链,用于标识符解析。当运行期上下文被创建时,其作用域链初始化为当前运行函数的[[Scope]]所包含的对象。

这些值按照它们在函数中出现的顺序被复制到运行期上下文的作用域链中。它们共同组成一个新的对象,称为“活动对象(activation object)”,该对象包含了函数的所有局部变量、命名参数、参数集合以及this,然后此对象会被推入作用域链的前端。当运行期上下文被销毁时,活动对象也随之销毁。新的作用域链如下图所示:

在JavaScript中获取Session的值:

闭包学习笔记:

闭包:在JS中,我的理解是将外部变量引用到函数内部,形成一个完全封闭的函数体。当内部函数在定义它的作用域的外部被引用时,就创建了该内部函数的闭包。如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存中不会被释放,因为闭包需要它们。

因此,本质上,闭包是将函数内部和函数外部连接起来的一座桥梁。

用途:闭包可以读取函数外部的变量,并让变量的值始终保持在内存中。

使用闭包时需要注意:

1)由于闭包会使函数中的变量都保存在内存中,内存消耗很大,因此不能滥用闭包,否则会造成网页性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部改变父函数内部变量的值。因此,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

作者最新文章