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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hu_belif/article/details/80177952

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的属性。关于变量的详细笔记地址:JS的初步探索(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创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量,如下图所示(注意:图片只例举了全部变量中的一部分):

 

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

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

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

 

 

闭包学习笔记:

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

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

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

使用闭包要注意:
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

 

 

 

 

感谢大神的分享,学习了:https://www.cnblogs.com/mrzl/p/4415149.html

    

展开阅读全文

没有更多推荐了,返回首页