javascript的apply和call,执行环境,垃圾回收,闭包
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>
本文出自 “matengbing” 博客,请务必保留此出处http://matengbing.blog.51cto.com/11395502/1879217
以上是关于javascript的apply和call,执行环境,垃圾回收,闭包的主要内容,如果未能解决你的问题,请参考以下文章
javascript的apply和call,执行环境,垃圾回收,闭包
JavaScript 之call , apply 和prototype 介绍
javascript中的函数对象的call和apply方法,及this指向总结