javascript函数定义三种方式详解

定义函数的三种方式

  • function语句式
function test1() {
    console.info("test1");
}
  • 函数的直接变量 ECMAScript
var test2 = function () {
    console.info("test2");
};
  • function构造函数式
var test3 = new Function("a","b","return a+b;");
console.info(test3(10,20));

解析顺序

对于function语句式这种方式,js解析器会优先解释,对于另外两种方式,仅仅是申明了(如果返回会是undefined),当函数体被执行的时候才会被正真地赋值

function f(){return 1;}                 // 函数1  
alert(f());     //返回值为4 说明第1个函数被第4个函数覆盖 
var f = new Function("return 2;");      // 函数2 
alert(f());     //返回值为2 说明第4个函数被第2个函数覆盖
var f = function(){return 3;}           // 函数3 
alert(f());        //返回值为3 说明第2个函数被第3个函数覆盖  
function f(){return 4;}                 // 函数4 
alert(f());     //返回值为3 说明第4个函数被第3个函数覆盖
var f = new Function("return 5");       // 函数5 
alert(f()); //返回值为5 说明第3个函数被第5个函数覆盖 
var f = function(){return 6 ;}          // 函数6 
alert(f());     //返回值为6 说明第5个函数被第6个函数覆盖

效率对比

var d1 = new Date();
var t1 = d1.getTime();
for(var i =0 ; i <100000;i++){
    //function test1(){;}       //function语句的形式
    var test2 = new Function();
}
var d2 = new Date();
var t2 = d2.getTime();
alert(t2 -t1); 

对于function语句的形式只会编译一次然后放到内存中供其他地方的再次使用,而使用构造函数的方式会每次都创建function对象,虽然随之会被销毁,但是在这里会使效率大幅降低

函数作用域

var k = 1 ; 
function t1(){
    var k = 2 ; //局部变量 k
    //function test(){return k ;}   //function语句    2
    //var test = function(){ return k}; //函数直接量   2
    //var test = new Function('return k;'); // 构造函数的方式   1
    alert(test());
}
t1();

对于function语句和函数直接量两种方式变量是具有函数的作用域,而Function构造函数的方式具有的是顶级函数的作用域

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值