函数声明与匿名函数

    一、函数本质:一个 封装代码段 的Function对象,函数名只是一个引用函数对象的变量
    函数的创建: 3种方法
      1. 声明: function 函数名(形参列表){函数体; return 返回值;}
         function fun和var fun都是声明/创建一个变量的意思,
             何时使用参数: 只要函数步骤中必须某些数据才能正常执行时,就要定义参数。
             何时使用返回值: 如果函数的调用者需要函数的执行结果时,函数就必须返回值。
        function声明的函数可被声明提前: 在程序开始执行前,会将var声明的变量和function声明的函数(注意是整个函数)提前到*当前作用域*的顶部集中创建。但赋值留在原地!
      2. 函数直接量:
       var  函数名=function(参数列表){函数体; return 返回值;};
       函数名仅是一个普通的变量,函数定义其实是一个对象,函数名中仅保存了函数对象的地址——引用,

     3. 用new:
       var 函数名=new Function("参数1","参数2",...,"函数体; return 返回值")//所有形参必须放在“”中!
       所有函数都是一个Function对象,所以可以直接用浏览器内部的内置对象:Function,实例化一个函数对象。
  二、匿名函数:

        没有名字的函数体:function(){...},它没有名字该怎么找到它呢?

        1、如上创建函数的第二种方法,定义一个变量保存存放函数体的地址。那么调用这个变量就相当于调用这个函数了;

var nAdd=function(){
var a=1;
console.log(a);
}
nAdd();//输出1

        2、使用()将匿名函数括起来,再添一个();立即执行这个函数体

alert((function(x,y){return x+y;})(2,3));// "5"  
alert((new Function("x","y","return x*y;"))(2,3));// "6"
 function outer(){
	    		var a=999;
	    		return a;
}	
alert((outer)());//输出999

        ()的作用:相当于对这个匿名函数实例化了,返回了一个Function对象,只是还是没有名字,需要立即执行(在函数后面添加())。

        好处:不用给函数起名字,调用完毕就释放内存,内存消耗不大。

思考一下:下面这段代码应该输出什么

function outer(){
	    		var a=999;
	    		function inner(){
	    			a++;
	    			return a;
	    		}
	    	}
alert((outer)());







答案是:输出undefined,因为执行函数后,没有返回值,所以返回值为undefined,里面的内部函数并没有被执行,只是创建了一个名字为inner函数对象。怎么执行inner函数可以移步:https://blog.csdn.net/lncci/article/details/80179669。所以(f)():就是将函数f执行了一遍。


猜你喜欢

转载自blog.csdn.net/lncci/article/details/80180997