如何学习 JavaScript学习过程

前辈的js学习方法
我比计较喜欢JS这个东西,感觉很高深...
首先,你学JS,你必须了解HTML文档的结构,所以你必须把HTML 以及
文档结构,能做到一个页面拿来能熟练的分析出文档的结构,哪些是节点,哪些元素
其次,你了解了页面的基本结构以后,你还得把JS的基础知识打好,每个语言都有自己的语法规则,不过都大同小异
上面两步操作你可以去w3schoool学习,那里的教程基础,争取每个例子都跑到
有了上面之后,你可以进行下一步,找一本对JS将的比较全面但是不是很深的书籍,让自己的知识系统化点
这样,基本上可以保证一般的JS多可以搞定。
你必须了解面向对象的思想,学们面向对象的语言,如果这个基础没有的话,对于JS的面向对象编程,那你只能抓破头皮啊,呵呵,以面向对象的思想写JS代码
很过瘾的。有了一定的深度以后,你还是看本书吧,推荐John Resig
《精通javascript》这本书,据说是最全最深的一本,如果能吸收50%的话,你再去看JQUERY Ext
等技术就很有亲切感了
最后,肯定自我创造,如果到了这一步,你可以自己写一些以类的方式写function以后,你应该看下js里写的比较好的面向对象的库
base、prototype库。
当然想要有更好的成绩,CSS的掌握也必不可少,因为好多JS效果都是与CSS配合的,比如拖拽、滑动等等
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。JavaScript1:javascript简介   JavaScript是一种脚本语言,能实现网页内容的交互显示,当用户在客户端显示该网页时,浏览器就会执行JavaScript程序,用户通过交互的操作来改变网页等等内容,来实现html语言无法实现的效果   (html是网页的基础,css是样式,js是特效)2:javascript语言特点   2.1:JavaScript是基于对象和事件驱动的(动态的),它可以直接对用户或客户输入做出响应,无须经过web服务程序,他对用户的响应,是采用以事件驱动的方式进行的 ,所谓事件驱动,就是指在主页中执行了某种操作产生的动作,就成为事件。比如按下鼠标,移动窗口,选择菜单都可以视为事件,当事件发生后,可能引起相应的事件响应   2.2:JavaScript是跨平台的
    javascript是依赖于浏览器本身的,与操作系统无关。3:如何使用JavaScript   3.1:通过&script&&/script&中直接编写   3.2:通过&script src='目标文档的URL'&&/script&链接外部的js文件   3.3:作为某个元素的事件属性值或者是超链接的href属性值     &a href="javascript:alert('hello')"&点击&/a&4:代码屏蔽   4.1:&!--//--&当浏览器不支持js时进行代码屏蔽   4.2:如果浏览器不支持js,可以使用&noscript&&/noscript&标签,显示noscript中的内容5:javascript的基本语法   5.1:JavaScript的执行顺序
    (1):按照在html文件中出现的顺序依次执行
    (2):优化由于html的执行顺序则js的代码(脚本)最好放在body标签中,放到网页的最后,css样式放在head标签中
    (遵循雅虎14条前端优化的规则)   5.2:大小写敏感,忽略空白符和换行符
    JavaScript严格区分大小写   5.3:语句分隔符
    使用结束语句;
    可以把多个语句写在一行;
    最后一个语句的分号可以省略,但尽量不要省略;
    可以使用{}括成一个语句组,形成一个block块;
  5.4:\进行折行操作是针对代码的,避免一行过长,
    document.write("asdfghjklqwer\
      tyuiopzxcvbnm");
  5.5:注释
    //单行注释内容
    /*
    *多行注释内容
    */   5.6:JavaScript中的错误   5.7:通过document.write()向文档书写内容(不可以拿来调试bug)
    通过console.log()向控制台写入内容(控制台输出)   5.8:火狐浏览器
   进行程序的断点调试,插件的安装,菜单--》附加组件--》Firebug
  (F12打开Firebug,firebug第一可以查看和编辑修改html和css的源码
  第二页面概况,第三动态执行JavaScript。火狐工具打断点调试,第四监控网络情况)
6:Javascript变量和数据类型   6.1:定义变量
    var 变量名;(var这个关键词可以省略的);   6.2:javascript变量的类型是如何决定的
    JavaScript中变量的数据类型是js引擎决定的;   6.3:typeof关键字
    检查变量代表的具体数据类型
    document.write(typeof name);
    document.write(typeof age);
    document.write(type 18);   6.4:数据类型
    (1):基本数据类型
      数值类型(Number):判断是否是数值类型isNaN();
      布尔类型(Boolean)
      字符串类型(String)
      null:空值
var sex=结果为
      null类型只有一个值,就是null,
      undefined:表示不存在的值或者尚未赋值的变量,对一个变量只声明不赋值或者赋予一个不存在的属性值,都会使这个变量的值为undefined
      undefined类型只有一个值undefined,当声明的变量未初始化的时候,该变量的默认值就是undefined
      document.write(null==undefined);结果为
      null和undefined的区别:null表示尚未存在的对象(typeof null),undefined声明变量但未对其初始化时赋予该变量的值
    (2):复合数据类型(引用数据类型)
      对象:var obj=new Object();
      数组:var arr=new Array();
      函数:var test=function(){
        console.log("函数的使用");
      }
    //调用函数
    test();   6.5:转换成数值
    (1):转换成整形:parseInt();
    (2):转换成浮点型:parseFloat();
    (3):Number()函数
    (4):注意:Number函数将字符串转换为数值比parseInt函数严格的多,基本上只要有一个字符无法转换成数值,整个字符串都会被转换为NaN;
3 &meta http-equiv="Content-Type" content="text/ charset=utf-8"/&
4 &!--link href="*.css" rel="stylesheet" type="text/css"&--&
&title&柠檬学院&/title&
&script language="javascript"&
//数值类型
var age=22;
//布尔类型
var flag=true;
//字符串类型
var name="别宏利";
//null类型
var sex=null;
//undefined类型表示只声明未对其进行初始化操作
var grade=
document.write("age="+age+"&br/&");
document.write("flag="+flag+"&br/&");
document.write("name="+name+"&br/&");
document.write("sex="+sex+"&br/&");
document.write("grade="+grade+"&br/&");
console.log(age);
console.log(flag);
console.log(name);
console.log(sex);
console.log(grade);
//复合数据类型,对象
var obj=new Object();
obj.name="biehongli";
obj.age="22";
obj.sex="nan";
document.write(obj.name+"&br/&");
document.write(obj.age+"&br/&");
document.write(obj.sex+"&br/&");
var arr=new Array();
arr[0]="12";
arr[1]="34";
arr[2]="55";
document.write(arr+"&br/&");//注意这个输出的全部的数值,自带分号
document.write(arr[0]+"&br/&");
document.write(arr[1]+"&br/&");
document.write(arr[2]+"&br/&");
console.log(arr);
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
var test=function(){
document.write("我是一个函数"+"&br/&");
console.log("我是一个函数");
test();//函数的调用
//数值类型的转换
var num1="125";
var num2="125";
var num3=num1+num2;
document.write(num3+"&br/&");
console.log(num3);
//parseInt();类型转换
var a="123";
var b=321;
var c=parseInt(a)+b;
document.write(c+"&br/&");
console.log(c);
//parseFloat();浮点型
var i=111.111;
var j=222.222;
var k=parseFloat(i)+parseFloat(j);
document.write(k+"&br/&");
console.log(k);
//判断是否是数值类型NaN
var v1="123";
var v2="123 456";
var v3="456a";
document.write("v1="+isNaN(v1)+"&br/&");
document.write("v2="+isNaN(v2)+"&br/&");
document.write("v3="+isNaN(v3)+"&br/&");
//Number函数
var test1="true";
var test2="false";
var test3=new Date();//获取当前时间
var test4="999";
var test5="999 888";
document.write(Number(test1)+"&br/&");
document.write(Number(test2)+"&br/&");
document.write(Number(test3)+"&br/&");
document.write(Number(test4)+"&br/&");
document.write(Number(test5)+"&br/&");
94 &/body&
95 &/html&
7:运算符与表达式   7.1:表达式-表达式是用于JavaScript脚本运行时进行计算的式子,可以包含常量,变量,运算符   7.2:运算符
    (1):算术运算符:
      +,-,*,/,%,++,--
    注意:
      《1》+号用来连接两个字符串
      《2》js代码的执行顺序是从左到右,所以在+连接的表达式中,遇到字符串型数据之前,所有出现的数值型数据
        (或者可以自动转换为数值型的数据)仍被作为数值来处理,为了避免这种情侣,我们可以在表达式前拼一个空字符串
      《3》只要+连接的操作数中有一个是字符串型,js就会自动把非字符串型数据作为字符串型数据来处理
    (2):字符连接符:通过+连接字符串
    (3):赋值运算符:=,+=,-= ,*= ,/= ,%=
    (4):比较运算符:&, & ,&= ,&= ,== ,!= ,!== ,===,
      比较运算符的结果为布尔类型
      注意:==用于一般比较,只要求值相等;===用于严格比较,值和类型都相等,只要类型不匹配就返回false;=是赋值
      实例:document.write("1"==true);//true
         &document.write("1"===true);//false
    &&(5):逻辑运算符:&&,||,!
      &&:结论第一个表达式为false,第二个表达式不执行;第一个表达式为true,第二个表达式才执行。
      ||:结论第一个表达式为false,第二个表达式才执行;第一个表达式为true,第二个表达式不执行。 &        注意:逻辑运算符的结果为布尔类型,&&如果第一个表达式为false,造成短路,||如果第一个表达式为true,造成短路
    (6):三元运算符:
      exp1?exp2:exp3;
    (7):其他运算符:
      (1):void运算符,用来指明一个表达式返回结果
      (2):typeof运算符,用来返回一个字符串,返回的是操作数的数据类型   7.3:运算符的优先级-通过()改变优先级8:流程控制   8.1:条件语句
    if(exp)执行一句代码
    if(exp){执行代码块};
    if(exp){exp为true执行代码段}else{exp为false执行代码段};
    if...elseif...
    switch...case
    if嵌套   8.2:循环语句
    (1):for循环:for(语句1;语句2;语句3){语句块}
    特殊情况如下
    for(x in arr)
    var arr={"张三","李四","阿五"};
    for(x in arr){document.write(arr[x]);}
    (2):while循环
      while(条件语句1){语句块}
    (3):do...while循环(这个循环至少会执行一次,即使这个条件为false)
      do{语句块}while(条件语句1);   8.3:特殊循环控制
    (1):break终止循环
    (2):continue跳过当次循环,进入下次循环
3 &meta http-equiv="Content-Type" content="text/ charset=utf-8" /&
4 &title&&/title&
&style type="text/css"&
&script language="javascript"&
document.write(a&8&&b&-1);//&&且运算符,相当于and
//true false false
//结论第一个表达式为false,第二个表达式不执行
//第一个表达式为true,第二个表达式才执行。
document.write("&br/&");
document.write(a+"&br/&");
document.write(b);
document.write("&br/&");
document.write(i&11||j&1);
document.write("&br/&");
document.write(i);
document.write("&br/&");
document.write(j);
document.write("&br/&");
document.write(!x);
document.write("&br/&");
var l=m&n?m:n;
document.write(l);
document.write("&br/&");
var age=18;
document.write(age&=18?"成年人哦":"未成年人哦");
document.write("&br/&");
42 &/body&
43 &/html&
9:Javascript函数   9.1:什么是函数?
    函数是完成某一功能的代码段,函数是可重复执行的代码段,函数方便管理和维护   9.2:函数的定义和使用
    9.2.1:函数的分类:
       自定义函数,我们自己编写的函数,通过function关键字;
       function 函数名称([参数...]){代码段;return 返回值;}
       系统函数,JavaScript自带的函数,如alert函数
    9.2.2:函数的声明
      常用方式:function 函数名([参数...]){代码段;}
调用方式:函数名();
      函数表达式:var 函数名=function([参数...]){语句块;}
调用方式:var 变量=函数名();
变量("实际参数");
    9.2.3:函数的调用方式
      普通调用:functionName(实际参数...)
      通过指向函数的变量去调用:var myVar=函数名;myVar(实际参数);   9.3:函数返回值
    当函数无明确返回值时,返回的值就是undefined
    当函数有返回值时,返回值是什么就返回什么   9.4:参数
    9.4.1:函数可以有参数也可以没有参数,如果定义了参数,在调用函数的时候没有传值,默认设置为undefined
    9.4.2:在调用函数时如果传递参数超过了定义时参数,js会忽略掉多余的参数
    9.4.3:可变参数
      函数的参数列表可以是任意多个,并且数据类型可以是任意的类型
      可以通过arguments对象实现可变参数的函数   9.5:局部变量,全局变量
    9.5.1:局部变量
      在函数体内声明的变量,仅在函数体内可以使用
    9.5.2:全部变量
      函数体外声明的变量,在变量声明开始到脚本结束都可以使用
    9.5.3:注意
      尽量控制全局变量的数量,容易引发bug
      最好总是使用var 语句来声明变量
  9.6:JavaScript创建动态函数
    动态函数比较用Function对象来定义(Function是JavaScript中的一个对象,是固定不变的,规定Function对象的"F"必须大写)
    创建动态函数的基本格式:var 变量名=new Function("参数1","参数2","参数3","参数n","执行语句");   9.7:匿名函数
    9.7.1:直接声明一个匿名函数,立即使用;
    9.7.2:好处:省得定义一个用一次就不用的函数,而且避免了命名冲突的问题。js中没有命名空间的概念,因此很容易函数命名的冲突,一旦命名冲突以最后声明为准
    9.7.3:格式:
      alert(function(i1,i2){return i1+i2; }(10,9));   9.8:JavaScript不支持函数的重载
    javascript没有方法重载的说法,如果两个方法名字一样,即使参数个数不一样,那么后面定义的就会覆盖前面定义,调用方法调用的是后面的方法。   9.9:JavaScript函数的特殊性
    JavaScript中的函数本身就是变量,所以函数也可以当做普通变量来使用。   9.10:JavaScript全局函数
3 &meta http-equiv="Content-Type" content="text/ charset=utf-8" /&
4 &title&&/title&
&style type="text/css"&
&script language="javascript"&
//常规方法,开发项目中使用较多,第二种使用方式较少
function test(str){
alert(str);
//函数调用的第一种方式
test("我的第一个函数");
//函数表达式
var test2=function(str2){
alert(str2);
//函数调用的第二种方式
var a2=test2;//这个不加括号()
a2("我的第二个函数");
//函数的返回值,无明确返回值,则返回undefined类型
function test3(name){
alert("hello:"+name);
var ret=test3("biexiansheng");//接收返回的值
alert("函数返回的结果"+ret);
//有返回值类型
function test4(name2){
alert("hello:"+name2);
return "hi"+name2;
var ret2=test4("biexiansheng");
alert("存在返回值类型:"+ret2);
//参数问题
function test5(num1,num2){
alert(num1);
alert(num2);
test5(15);//传递的实参少于形参,则最后的输出undefined
test5(69,96);
test5(11,22,33);/*传递的实参大于形参,则最后的实参不被输出*/
/*可变的参数:函数的参数列表任意多个,数据类型也是任意的类型*/
/*可变参数,每个函数里面有2个变量 this arguments*/
//add函数是一个参数可变的函数
function add(){
alert("参数的个数"+arguments.length);
for(var i=0;i&arguments.i++){
alert(arguments[i]);
//调用函数
add("biexiansheng",18,"男");
//实现任意多个参数的和运算
function add(){
alert("参数的个数"+arguments.length);
var result=0;
for(var i=0;i&arguments.i++){
result+=arguments[i];
alert(result);
add(1,2,3,4,5);
/*全局变量和局部变量的学习*/
var name="biexiansheng";
function test(){
var age=22;
//如果在函数内部声明变量不加var,那么这个变量为全局变量
sex="男";//全部变量
alert("函数内部引用全部变量name:"+name);
alert("函数内部引用局部变量age:"+age);
alert("函数内部引用全部变量sex:"+sex);
test();//调用函数
alert("函数外部引用全部变量sex:"+sex);
alert("函数外部引用全部变量name:"+name);
alert("函数外部引用局部变量age:"+age);/*不会执行,则下面的代码也不会执行*/
/*动态函数创建和使用*/
//常规方式
function sum1(num1,num2){
return num1+num2;
//表达式方式
var sum2=function(num1,num2){
return num1+num2;
/*动态函数创建,不常用*/
var sum3=new Function("num1","num2","return num1+num2");
document.write("&pre&");
document.writeln("sum1(1,2)="+sum1(1,2));
document.writeln("sum2(11,22)="+sum2(11,22));
document.writeln("sum3(16,24)="+sum3(16,24));
document.write("&pre&");
//匿名函数,在jQuery中使用最多。写插件
alert(function(a,b){
return "和:"+(a+b);
109 &/body&
110 &/html&
&10:javascript全部函数&& &10.1:parseInt(string,radix):返回转换成整数的值&& &10.2:parseFloat(string):返回转换成浮点数的值&& &10.3:isFinite(value):检测某个是否是无穷值&& &10.4:isNaN(value):检测某个值是否是NaN,检测是否是非数字值,如果值为NaN返回true,否则返回false&& &&& &var a="111";&& &&& &alert(isNaN(a));&& &10.5:encodeURI(uri):将字符串编码为URI&& &&& &注意:使用decodeURI()方法可以编码URI(通用资源标识符:UniformResourceIdentifier,简称"URI")&& &&& &&& &对以下在URI中具有特殊含义的ASCII标点符号,encodeURI()函数不会进行转义的:. / ? : @ & = + $ #(可以使用encodeURIComponent()方法分别对特殊含义的ASCII标点符号进行编码)&& &10.6:decodeURI(uri):解码某个编码的URI&& &10.7:encodeURIComponent():将字符串编码为uri组件&& &10.8:dncodeURIComponent():解码一个编码的uri组件&& &10.9:escape():对字符串进行编码&& &10.10:unescape():解码由escape()编码的字符串&& &10.11:eval():将javascript字符串当作脚本来执行&& &&& &注意:&& &&& &&& &如果参数是一个表达式,eval()函数将执行表达式,如果参数是javascript语句,eval()将执行javascript语句&& &&& &&& &eval()函数是一种由函数执行的动态代码,比直接执行脚本慢很多&& &&& &&& &慎重使用eval()函数,尽量不用,保证程序的安全性&& &&& &var str="alert('测试')";&& &&& &eval(str);&& &10.12:Number(object):把对象的值转换为数字&& &&& &注意:如果对象的值无法转换为数字,Number()函数返回NaN&& &&& &&& &如果参数的Date对象,Number()返回从日到现在所经历的毫秒数&& &10.13:String:把对象的值转换为字符串&& &&& &&& &String()函数返回与字符串对象的toString()方法值一样&& &&& &var b=new Number(true);&& &&& &alert(b);&& &&& &&& &&& &&& &var c=new String(123);&& &&& &alert(c+111);11:事件&& &11.1:什么是事件?&& &&& &指的是文档或者浏览器窗口发生的一些特定交互瞬间,我们可以通过侦听器(或者处理程序)来预定事件,以便事件发生的时候执行相应的代码&& &11.2:鼠标事件&& &&& &onmousedown:鼠标按钮被按下&& &&& &onmousemove:鼠标被移动&& &&& &onmouseout:鼠标从某元素移开&& &&& &onmouseover:鼠标移到某元素之上&& &&& &onmouseup:鼠标按键被松开&& &11.3:键盘事件&& &&& &onkeydown:某个键盘按键被按下&& &&& &onkeypress:某个键盘按键被按下并松开&& &&& &onkeyup:某个键盘按键被松开&& &11.4:表单事件&& &&& &onblur:元素失去焦点&& &&& &onchange:域的内容被改变&& &&& &onclick:当用户点击某个对象的调用的事件句柄&& &&& &ondblclick:当用户双击某个对象的调用的事件句柄&& &&& &onerror:在加载文档或图像时发生错误&& &&& &onfocus:元素获得焦点&& &&& &onselect:文本被选中&& &&& &onsubmit:确认按钮被点击&& &&& &onunload:用户退出页面12:DOM&& &12.1:DOM简介:当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)&& &&& &javascript能够改变页面中的所有HTML元素&& &&& &javascript能够改变页面中的所有HTML属性&& &&& &javascript能够改变页面中的所有css样式&& &&& &12.2:查看HTML元素&& &&& &注意:通过id找到HTML元素--document.getElementById("info");&& &&& &&& && 通过标签名找到HTML元素--document.getElementsByTagName&& &&& &&& && 通过标签的name属性获取元素--document.getElementsByName&& &12.3:改变HTML输出流document.write&& &12.4:修改HTML内容:使用innerHTML属性
13:Javascript数组的学习和应用
  13.1:数组的创建
    1:document.write("1:创建一个空数组"+"&br/&");      var arr1=new Array();    2:document.write("2:指定数组的长度"+"&br/&");      var arr2=new Array(5);    3:document.write("3:创建数组并初始化参数"+"&br/&");      var arr3=new Array(9528,"小别","男");    4:document.write("4:创建一个数组"+"&br/&");      var arr4=[];    5:document.write("5:使用括号[],并且传入初始值"+"&br/&");      var arr5=[12,23,45,6,8];&& &&&&
阅读(...) 评论()推荐这篇日记的豆列
&&&&&&&&&&&&其他回答(9)
JS知识你可以去看下 &《js dom艺术编程》这本书 个人感觉不错。
至于cms你可以到网上下载几个下来学,不过建议你还是先学基础,这些写好的东西不利于你对语言的学习、理解。
JS的话可以买书看,比如这2本和《》
《&JavaScript高级程序设计》是学习JS的基础,《JavaScript DOM 高级程序设计》是深入学习JS
至于.NET和CMS。.NET是框架技术,CMS是指内容管理系统(可以基于PHP,JSP,ASP.NET),如果想学的话建议先吧.NET相关知识学习下,然后再学习ASP.NET最后才是学习CMS。
如果一上来就看CMS会无从下手
园豆:5587
可以研究下jquery的实现代码
javascript 权威指南,中文版的英文版的都可!
javascript 权威指南
深入浅出JavaScript PDF:/topics/2761926/
21天学通JavaScript 光盘镜像 :/topics/2758214/
这个也不错:/topics/2761387/
收获园豆:5
园豆:40785
《javascript捷径教程》很不错。
一个字,写
先理解原理,然后就是敲代码。
&&&您需要以后才能回答,未注册用户请先。学习Javascript闭包(Closure) - 阮一峰的网络日志
学习Javascript闭包(Closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
  var n=999;
  function f1(){
    alert(n);
  f1(); // 999
另一方面,在函数外部自然无法读取函数内的局部变量。
  function f1(){
    var n=999;
  alert(n); // error
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
  function f1(){
    n=999;
  alert(n); // 999
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
  function f1(){
    var n=999;
    function f2(){
      alert(n); // 999
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
  function f1(){
    var n=999;
    function f2(){
      alert(n);
    return f2;
  var result=f1();
  result(); // 999
三、闭包的概念
上一节代码中的f2函数,就是闭包。
各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
四、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
怎么来理解这句话呢?请看下面的代码。
  function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    return f2;
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
五、使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
六、思考题
如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了。
代码片段一。
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.
      };
  alert(object.getNameFunc()());
代码片段二。
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that =
      return function(){
        return that.
      };
  alert(object.getNameFunc()());
Web 技术突飞猛进,但是有一个领域一直无法突破 ---- 游戏。
Node 主要用在开发 Web 应用。这决定了使用 Node,往往离不开 Web 应用框架。
一、什么是内存泄漏?
程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。
学习函数式编程,必须掌握很多术语,否则根本看不懂文档。}

我要回帖

更多关于 JavaScript学习指南 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信