函数声明
function add(a,b){
a=+
a;
b=+
b;
if(isNaN(a)||isNaN(b))
{
return 0
;
}
return a+b
;
}
函数表达式
//function variable
var add=function(a,b)
{
//do s
th
}
;
//IEF(Immediately Executed Function)
(function()
{
//do s
th
})(); //这里加多了个括号表示该方法构造后立即执行
//first-class functio
n
return function()
{
//do sth
}
;
//NFE(Named Function Expression 命名函数语句
)
var add=function foo(a,b)
{
//do s
th
}
;
变量&函数的声明前置
例1: (function add() 方法被隐式前置)
var num=add(1,2);
console.log(num)
;
function add(a,b)
{
a=+
a;
b=+
b;
if(isNaN(a)||isNaN(b))
{
return
;
}
return a+b
;
}
例2:
(add,变量被隐式前置)
var num=add(1,2);
console.log(num); //TypeError:undefined is not a function
var add=function(a,b){
a=+a
;
b=+b
;
if(isNaN(a)||isNaN(b)){
return;
}
return a+b;
}
说明:这两端代码都是调用函数在前,构造函数在后,例1方法会(隐式)前置并执行成功,例2变量会(隐式)前置调用方法,但执行失败,该变量所赋的函数表达式只能在变量后置时执行
命名函数表达式
例:var func=function nfe(){};
alert(func===nfe); //在IE6-8中,返回的是false,IE9+返回undefine
d
//递归调用
var func=function nfe()
{
nfe()
;
}
Function构造器
例1:
var func=new Function('a','b','console.log(a+b);') //原来在js中函数体可以写在方法的参数列表中,前两个表示参数,最后一个表示方法的函数体
func(1,2); //3
//等价于
var func=Function('a','b','console.log(a+b);')
func(1,2); //3
例2:
Function('var localVal="local"; console.log(localVal);')(); //首先用Function构造器创建一个函数,没想到居然能这么草率的构造函数,跟之前的函数构造方式有区别
console.log(typeof localVal); //local undefined,这里的localVal为局部变量,不能被调
用
例3:
var globalVal='global'
;
(function()
{
var localVal='local'
;
Function('console.log(typeof localVal,typeof globalVal);')(); //undefined string 在这里,函数构造器访问不到外层函数变量,但可以访问全局
变量
}
)
三种函数区别: