JS页面获取 session 值,作用域和闭包学习笔记


Posted in Javascript onOctober 16, 2019

本文实例讲述了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中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

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

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

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

JS页面获取 session 值,作用域和闭包学习笔记

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

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

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

JS页面获取 session 值,作用域和闭包学习笔记

闭包学习笔记:

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

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

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

使用闭包要注意:

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

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

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

Javascript 相关文章推荐
jQuery对表单元素的取值和赋值操作代码
May 19 Javascript
jQuery判断元素是否存在的可靠方法
May 06 Javascript
JavaScript中Object.prototype.toString方法的原理
Feb 24 Javascript
12 款 JS 代码测试必备工具(翻译)
Dec 13 Javascript
Bootstrap列表组学习使用
Feb 09 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
Sep 11 jQuery
移动端效果之IndexList详解
Oct 20 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
Jan 25 Javascript
Angularjs实现控制器之间通信方式实例总结
Mar 27 Javascript
使用vuex缓存数据并优化自己的vuex-cache
May 30 Javascript
vuex的module模块用法示例
Nov 12 Javascript
vue-router之实现导航切换过渡动画效果
Oct 31 Javascript
js实现图片跟随鼠标移动效果
Oct 16 #Javascript
vue实现鼠标经过动画
Oct 16 #Javascript
javascript实现动态时钟的启动和停止
Jul 29 #Javascript
JavaScript Canvas编写炫彩的网页时钟
Oct 16 #Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
Oct 16 #Javascript
javascript实现点亮灯泡特效示例
Oct 15 #Javascript
vue-cli 为项目设置别名的方法
Oct 15 #Javascript
You might like
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
Javascript实现计算个人所得税
2015/05/10 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
关于python2 csv写入空白行的问题
2018/06/22 Python
python虚拟环境迁移方法
2019/01/03 Python
django如何实现视图重定向
2019/07/24 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
护理自荐信范文
2013/10/05 职场文书
大学生入党思想汇报
2014/01/14 职场文书
书法比赛获奖感言
2014/02/10 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
满月酒邀请函
2015/01/30 职场文书
小浪底导游词
2015/02/12 职场文书
2015年科室工作总结
2015/04/10 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
Golang 并发编程 SingleFlight模式
2022/04/26 Golang