关于声明VS表达式

函数声明
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 在这里,函数构造器访问不到外层函数变量,但可以访问全局 变量
} )




三种函数区别:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值