一、函数本质:一个 封装代码段 的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)());
扫描二维码关注公众号,回复:
424866 查看本文章
答案是:输出undefined,因为执行函数后,没有返回值,所以返回值为undefined,里面的内部函数并没有被执行,只是创建了一个名字为inner函数对象。怎么执行inner函数可以移步:https://blog.csdn.net/lncci/article/details/80179669。所以(f)():就是将函数f执行了一遍。