JS——函数小结(2)

匿名函数和闭包

到目前为止我们学过的函数都有一个函数名通过函数名传递相应的参数调用该函数,但是这次在JS中的接触到函数可以没有名字名字就是匿名函数。那么我们一般是如何调用匿名函数的呢

方法一:这也是函数的一种声明方式
var sum=function(x,y)  {
   return x+y;
}
alert(sum (2,3)); // "5"
方法二:匿名函数还能够进行自我执行
Alert((function(x,y)  {  return x+y;})(2,3));   

匿名函数的自我执行可以解决匿名函数的一些问题,例如在循环中的匿名函数是有一定的问题的

function box(){
       var arr=[];
       //在循环中使用匿名函数
       for(var i=0;i<5;i++){
              arr[i]=function(){
                    return i;
              };
       }

       return arr;
}

var b=box();
//在这里调用box()的时候,里面的循环已经执行完毕了,执行到return了,所以最后return的arr的最终结果为5
1、调用内部的匿名函数输出结果
for(var i=0;i<5;i++){
       alert(b[i]());
//结果都为5个5。这里调用执行匿名函数时i已经为5,所以不会再做++了,所以结果都为5
}

这样的问题就可以通过匿名函数的自我执行解决

//通过匿名函数的自我执行
function box(){
   var arr=[];

   for(var i=0;i<5;i++){
      arr[i]=(function(num){   //通过自我及时执行匿名函数,将每个值都保存到arr中
         return num;
      })(i);
   }
   return arr;
}
var b=box();
for(var i=0;i<5;i++){
   alert(b[i]); //依次返回 1 2 3 4 5
}

在JS的函数中还学习了闭包,自己理解的就是函数中再放入一个函数就构成闭包。给出的官方的定义是:某种程序语言中的代码块允许一级函数存在并且在一级函数中所定义的自由变量能不被释放,直到一级函数被释放前,一级函数外也能应用这些未释放的自由变量。这段话结合JS视频中给出的例子

function box(){//声明box函数
   var age=100;        //age是在box内的局部变量
   returnfunction(){     //一个匿名函数,这样就构成了闭包
      age++; //对局部变量进行自加
      return age;//返回结果
   };
}
var b=box();//这里对age进行了初始化值为100
alert(b());//101
alert(b());//102
alert(b());//103
//实现对age累加。如果不使用闭包,每次回调用box这样每次都会初始化age,无法实现累加

box()就是一级函数其中的age是自由变量初始值为100,每次进行b()的时候是对其中匿名函数的自我执行,因为构成了闭包,所以在调用函数自我执行时其中的age是不会被释放的,从而实现累加。

小结

匿名函数和闭包在实际的应用中经常是结合到一起的,例如在循环中的匿名函数取值是存在问题的还可以使用闭包来解决JS中的很多知识都是第一次的接触到,结合视频中讲的实例和在后期博客实例的应用中自己进行的初步简单的理解,知识能够把视频中的知识点理解通,还有待深一步的理解。

时间: 2024-08-13 14:33:27

JS——函数小结(2)的相关文章

JS——函数小结(1)

函数的声明和冒充 要了解call和apply就要从JS的函数开始说明,函数的声明包括三种方式 <span style="font-size:18px;">一般的声明方法 function box(num1,num2){ return num1+num2; } alert(box(1,3));//4 //使用变量初始化函数 var box=function(num1,num2){ return num1+num2; }; alert(box(1,3));//4 //使用Fun

js 格式化时间日期函数小结

下面是脚本之家为大家整理的一些格式化时间日期的函数代码,需要的朋友可以参考下. 代码如下: Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month "d+" : this.getDate(), //day "h+" : this.getHours(), //hour "m+" : this.getMinutes(

js加强小结

一)回顾JavaScript基础 (1)函数的定义方式 *>>正常方式 function add(num1,num2){...} >>构造器方式 var add = new Function("num1","num2","return num1+num2"); *>>匿名/无名方式 var add = function(num1,num2){函数体} (2)window对象是什么 在JS中,window表示整个

js isArray小结

原文:[转载]js isArray小结 在日常开发中,我们经常需要判断某个对象是否是数组类型的,在js中检测对象类型的常见的方法有几种: 1.typeof操作符.对于Function.String.Number.Undefined这几种类型的对象来说,不会有什么问题,但是针对Array的对象就没什么用途了: Js代码  isArray小结" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png"

js 事件小结

1,事件对象   e || window.event //ie   2, 取鼠标点击坐标 带有滚动条的   var top = document.documentElement.scrollTop || document.body.scrollTop;//chorme var x = top + e.clientX; //可视区坐标   3, 获取屏幕坐标 e.screenX e.screenY   4, shiftKey altKey ctrlkey   5,onkeydown/onkeyup

JS函数大全 莫名其妙找到的

1 .document.write(""); 输出语句 2 .JS中的注释为// 3 .传统的HTML文档顺序是:document->html->(head,body) 4 .一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5 .得到表单中元素的名称和值:document.getElementById("表单中元素的ID号").name(或value) 6 .

JSF页面中使用js函数回调后台bean方法并获取返回值的方法

由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的,很可能会误导使用者. 相对来说,看国内的那些仅仅是翻译过来的文章或书籍不如直接看国外的官方文档或资料来的实在,在我讲述jsf页面中如何使用js调用后台bean方法之前,先给大家说几个国外的资料.在primefaces官方网站上,你可以搜索到几乎所有你需要的东西,primefaces官网为:http:

webBrowser调用外部js文件和js函数(转载)

原文链接:http://fy5388.blog.163.com/blog/static/56499537201012594314130/ webBrowser调用外部js文件和js函数 '第一种方法:webbrowser动态调用html和js代码,都是动态的:代码示例: webBrowser1.Navigate("about:blank");webBrowser1.Document.OpenNew(True);webBrowser1.Document.Write("<H

JavaScript入门:006—JS函数的定义

JS函数的声明.声明函数的格式如下: function 函数名(参数列表){ //函数语句: return 返回值; } 来看具体的函数声明.1.普通函数 <script type="text/javascript"> function ShowHint() { alert("普通函数"); } </script> 2.带参数的函数 <script type="text/javascript"> functio