javascript的apply和call,执行环境,垃圾回收,闭包

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP ‘test3.jsp‘ starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <script src="js/jquery-2.1.1.min.js"></script>
    <script>
    //简单的用法:绑定一些函数,用于传递参数,调用
    function sum(a,b){
        return a+b;
    }
    function call1(a,b){
        return sum.call(this,a,b);
    }
    
    function apply1(a,b){
        return sum.apply(this,[a,b]);        //后面是一个数组
    }
    //alert(call1(10,20));
    //alert(apply1(1,2));
    
    
    
    //扩充函数的作用域
    window.color=‘red‘;
    var obj={color:‘blue‘};
    function showColor(){
        alert(this.color);
    } 
    //showColor(this.color);     //输出red,因为当前对象是window
    //showColor(obj);             //输出red     因为调用者是window对象,showColor中的this指向调用者
    //showColor.call(obj);        //blue       call函数扩展了作用域,this指向传入的对象obj
    function test(a,b){
        return a+b;
    }
    
    //自定义对象
    function Obje(a,b){
        this.a=a;
        this.b=b;
        return a*b;
    }
    var o=new Obje(10,20);
    o.method=test;
    alert(o.method(o.a,o.b));                //相当于alert(test.call(o,o.a,o.b));
    delete o.method;
    //alert(test.call(o,o.a,o.b));            //输出30 即a+b
    </script>
  </head>
  
  <body>
    This is my JSP page. <br>
  </body>
</html>

执行环境

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP ‘test3.jsp‘ starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <script src="js/jquery-2.1.1.min.js"></script>
    <script>
    //1.执行环境window对象(最上层的执行环境)
    var color1=‘red‘;
    function changeColor(){      //每一个函数都有一个执行环境(variable obj)
        var color2=‘blue‘;
        function swap(){                   //这个函数又产生了一个执行环境(variable obj)
            var color3=color2;
            color2=color1;
            color1=color3;
            //这里可以访问color1,2,3,
            //color1:一级作用域,color2:二级作用域,color2:三级作用域
        }
        //这里可以访问color1,2,不能访问color3
        swap();
    }
    //环境变量,可以一层一层的向上追溯,访问它的上级环境(变量和函数)
    //注意逐层向上
    changeColor();          //作用域window,第一个作用环境
    //这里只能访问color1
    </script>
  </head>
  
  <body>
    This is my JSP page. <br>
  </body>
</html>

垃圾回收

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP ‘test3.jsp‘ starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <script src="js/jquery-2.1.1.min.js"></script>
    <script>
    //javascript具有自动垃圾回收机制,离开作用域的变量标记为可以回收,在垃圾回收期间被回收
    //垃圾收集方法1.标记,2.引用计数法
    function test(){
        var a=10;       //标记使用      count=1;
        var b=20;          //标记使用   count=1;
        var c=a;         //count=2;
        a=20;            //count=1;
    }
    //test();             //执行完a,b再次标记为没有被使用
    
    
    
    //块级作用域
//    function test2(){
//        for(var i=0;i<3;i++){
//            alert(i);
//        }
//        alert(i);      //javascript没有块级作用域的概念,会打印出3
//    }
//    test2();
    //js:()表示执行
    function test2(){
        (function(){
            for(var i=0;i<3;i++){
            alert(i);
        }
        })();              //定义了一个内名函数,单独做一个作用域,并立即执行,执行完作用域被回收
        
        //alert(i);        //undefined
    }
    test2();
    
    (function(){alert("立即执行");})();        //单独做一个作用域,立即执行
    </script>
  </head>
  
  <body>
    This is my JSP page. <br>
  </body>
</html>

闭包

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP ‘test3.jsp‘ starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <script src="js/jquery-2.1.1.min.js"></script>
    <script>
    var name="张三";
    var obj={
        name:"王五",
        getName:function(){
            return function(){
                return this.name;
            }
        }
    };
//    alert(obj.getName());        //obj.getName()返回的是一个函数                   即  function(){return this.name;}        
//    //alert(obj.getName()());
//    var k=obj.getName();           //全局作用域
//    alert(k());       //等同于alert(window.k());  张三
    
    
    
    
    var name="张三";
    var obj={
        name:"王五",
        getName:function(){
            //this总是指向调用者
            var o=this;                //o保存了this
            return function(){
                return o.name;
            }
        }
    };
    //alert(obj.getName());        //obj.getName()返回的是一个函数                   即  function(){return this.name;}        
    //alert(obj.getName()());
    //var k=obj.getName();           //全局作用域
    //alert(k());                   //王五
    
    
    //闭包:一个函数可以访问另一个函数作用域中的变量
    //封闭性:相当于java中的private保护变量
    
    //1
    function f(x){         //2
        var temp=x;                   //被标记为未被使用
        return function(x){            //3   function有了一个执行域
            temp+=x;                   //在此处,第三级引用了第二级的变量,又被标记为被使用,不会被回收
            alert(temp);
        }
    }
    var a=f(50);
    alert(a);
    a(5);
    a(10);
    
    </script>
  </head>
  
  <body>
    This is my JSP page. <br>
  </body>
</html>
时间: 2024-12-21 23:53:09

javascript的apply和call,执行环境,垃圾回收,闭包的相关文章

深入理解闭包系列第二篇——从执行环境角度看闭包

× 目录 [1]图示 [2]说明 [3]总结 前面的话 本文从执行环境的角度来分析闭包,先用一张图开宗明义,然后根据图示内容对代码进行逐行说明,试图对闭包进行更直观的解释 图示 说明 下面按照代码执行流的顺序对该图示进行详细说明 function foo(){ var a = 2; function bar(){ console.log(a); } return bar; } var baz = foo(); baz(); [1]代码执行流进入全局执行环境,并对全局执行环境中的代码进入声明提升(

Javascript手记-执行环境和作用域

执行环境是javascript一个重要的概念,执行环境定义了变量有权访问其他数据决定了他们各自的行为,每个执行环境 都有一个与之关联的变量,环境中定义的所有变量和函数都保存在这个对象中,虽然我们编写的代码无法访问这个对象,但 解析器在处理数据时候会在后台使用. 全局执行环境是最外围的一个执行环境,根据ecmascript实现所在的宿主环境不同,表示执行环境的对象也不一样在 web浏览器中,全局执行环境被认为是window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建 的某

JavaScript 执行环境及作用域

在JavaScript高级程序设计中,执行环境的定义是:定义了变量或函数有权访问的其他数据,决定了它们各自的行为. 每个执行环境都有一个与之关联的变量对象,环境中定义了所有变量和函数都保存在这个对象中. 其实执行环境就是JavaScript中的作用域 每个函数都有自己的执行环境.当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而且在函数执行完之后,栈将环境推出,把控制权返回之前的执行环境. 内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中任何变量和函数.这些环境

JavaScript中执行环境和栈

在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他们的值是如何确定的有一个清晰的认识. 什么是执行环境(执行上下文)当代码在JavaScript中运行的时候,代码在环境中被执行是非常重要的,它会被评估为以下之一类型来运行:全局代码:默认环境,你的代码第一时间在这儿运行.函数代码:当执行流进入一个函数体的时候.Eval代码:在eval()函数中的文本. 你可以

JS 执行环境与作用域链

1.执行环境 JavaScript 代码都是在执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生命周期等方面的处理,它定义了变量或函数是否有权访问其他数据,决定各自行为.每个执行环境都有一个变量对象(我理解为环境变量对象),在代码执行环境中所有的变量.函数都保存在这个对象中: 全局的执行环境是最外围的执行环境,根据ECMAScript 实现所在的宿主环境同,表示执行环境的对象也不一样,在WEB浏览器中,全局执行环境被认为是Windows对象,因此所有

浅谈JS执行环境及作用域

 今天刚刚开通博客,也是第一次写博文,略感紧张.作为一个表达能力弱弱的人来说,自己花三分钟理解一个知识点,当别人问起时,也许需要30分钟才只是让别人知道自己在说什么,一点也不夸张,希望在博客上可以练习对语言的组织能力并记录学习笔记与大家一起交流. 进入正题>> 首先,相关的概念定义如下: 1. 执行环境: 所有 JavaScript 代码都是在一个执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生存期等方面的处理,它定义了变量或函数有权访问的其他数

2017-5-26执行环境及租用域

执行环境及作用域 执行环境及作用域 执行环境及作用域 执行环境:定义了变量和函数有权访问的其他数据,决定了它们各自的行为,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中 *全局执行环境:是最外围的一个执行环境,全局执行环境直到应用程序退出时才会被销毁; 1.每个函数都有自己的执行环境 2.在局部作用域中定义的变量可以在局部环境中与全局变量互换使用 4.2.1 延长作用域链 执行环境的类型总共只有两种:全局和局部(函数) 延长作用域链:有些语句可以在作用域链的

执行环境,作用域

在javascript的学习中,执行环境.作用域是2个非常非常重要和基本的概念,理解了这2个概念对于javsacript中很多脚本的运行结果就能明白其中的道理了,比如搞清作用域和执行环境对于闭包的理解至关重要. 一.执行环境(exection context,也有称之为执行上下文) 所有 JavaScript 代码都是在一个执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生存期等方面的处理,它定义了变量或函数是否有权访问其他数据,决定各自行为. 在j

.Net 垃圾回收机制原理(一)

英文原文:Jeffrey Richter 编译:赵玉开 链接:http://www.cnblogs.com/yukaizhao/archive/2011/11/23/dot_net_GC_1.html 有了Microsoft.Net clr中的垃圾回收机制程序员不需要再关注什么时候释放内存,释放内存这件事儿完全由GC做了,对程序员来说是透明的.尽管如此,作为一个.Net程序员很有必要理解垃圾回收是如何工作的.这篇文章我们就来看下.Net是如何分配和管理托管内存的,之后再一步一步描述垃圾回收器工作

【译】.Net 垃圾回收机制原理(转)

上一篇文章介绍了.Net 垃圾回收的基本原理和垃圾回收执行Finalize方法的内部机制:这一篇我们看下弱引用对象,代,多线程垃圾回收,大对象处理以及和垃圾回收相关的性能计数器. 让我们从弱引用对象说起,弱引用对象可以减轻大对象带来的内存压力. 弱引用(Weak References) 当程序的根对象指向一个对象时,这个对象是可达的,垃圾回收器不能回收它,这称为对对象的强引用.和强引用相对的是弱引用,当一个对象上存在弱引用时,垃圾回收器可以回收此对象,但是也允许程序访问这个对象.这是怎么回事儿呢