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 相关文章推荐
让ie运行js时提示允许阻止内容运行的解决方法
Oct 24 Javascript
javascript中的parseInt和parseFloat区别
Jul 12 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
Mar 12 Javascript
jquery.validate.js插件使用经验记录
Jul 02 Javascript
究竟什么是Node.js?Node.js有什么好处?
May 29 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
Nov 17 Javascript
javaScript知识点总结(必看篇)
Jun 10 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
jQuery实现拼图小游戏(实例讲解)
Jul 24 jQuery
在vue项目中集成graphql(vue-ApolloClient)
Sep 08 Javascript
通过实践编写优雅的JavaScript代码
May 30 Javascript
教你使用vscode 搭建react-native开发环境
Jul 07 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
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
Vue列表渲染的示例代码
2018/11/01 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
antd Upload 文件上传的示例代码
2018/12/14 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
Python中Django 后台自定义表单控件
2017/03/28 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
​如何愉快地迁移到 Python 3
2019/04/28 Python
简单了解django索引的相关知识
2019/07/17 Python
Python class的继承方法代码实例
2020/02/14 Python
Python使用configparser库读取配置文件
2020/02/22 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
2020/11/20 Python
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
查环查孕证明
2014/01/10 职场文书
25岁生日感言
2014/01/13 职场文书
培训班开班主持词
2015/07/02 职场文书
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android