js(es5)定义函数三种形式笔记

js(es5)定义函数三种形式笔记

1. 定义函数3种形式:

  1. function语句形式定义函数
  2. function直接量定义函数
  3. Function构造函数形式定义函数

实例1:三种形式的写法

//语句形式定义函数              
function test1(){ 
    
        alert("hello function1");
    }
//直接量形式定义函数
var test2=function(){
    
        alert("hello function2");
    }
//直接量形式定义函数
var test3=new Function("a","b","return a+b");
//调用函数
test1();//输出hello function1
test2();//输出hello function2
alert(test3(1,2));//输出3

三种函数的对比:
659870-20171124012719984-359221770.png

三种函数形式效率对比:

  1. function语句形式效率比构造函数形式效率高;
  2. function语句形式声明后会占用内存,但是构造函数形式定义函数调用完毕后会从内存中清除;
  3. 用法:如果调用次数多就使用语句式,如果只调用一次就用构造函数式;
    原因:构造函数每new一次就会创建一次函数,而function语句只声明一次;

实例2:效率对比

var d1 = new Date();
var t1 = d1.getTime();
for(var i =0 ; i <100000;i++){
//function test1(){;}
//var test2 = new Function();
}
var d2 = new Date();
var t2 = d2.getTime();
alert(t2 -t1); 
//语句式执行时间11-15毫秒,构造函数式执行时间1-5秒左右

function语句形式优先被js解析器解释:

test1();//打印test1

function test1(){
        alert("test1");
}

alert(test2);//undefined 声明了,但是没有赋值
test2();//报错:test2 is not function
var test2=function(){
    alert("test2");
}

解析顺序案例:

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个函数覆盖

//结果:423356 注意:js中没有重载概念,先解释function语句式

函数作用域案例:

var k = 1 ; 
function t1(){
var k = 2 ; //局部变量
function test(){return k ;} 
//var test = function(){ return k};
//var test = new Function('return k;');
alert(test());
}
t1();// 输出2

var k = 1 ; 
function t1(){
var k = 2 ; //局部变量
//function test(){return k ;} 
var test = function(){ return k};
//var test = new Function('return k;');
alert(test());
}
t1();// 输出2

var k = 1 ; 
function t1(){
var k = 2 ; //局部变量
//function test(){return k ;} 
//var test = function(){ return k};
var test = new Function('return k;');
alert(test());
}
t1();// 输出1 由于构造函数式具有顶级作用域关系,所以,找不到局部变量这段代码相当于下面这段代码

var test = new Function('return k;');
var k = 1 ; 
function t1(){
var k = 2 ; //局部变量
//function test(){return k ;} 
//var test = function(){ return k};

alert(test());
}
t1();// 输出1

转载于:https://www.cnblogs.com/geekjason/p/7888254.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值