js(es5)定义函数三种形式笔记
1. 定义函数3种形式:
- function语句形式定义函数
- function直接量定义函数
- 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
三种函数的对比:
三种函数形式效率对比:
- function语句形式效率比构造函数形式效率高;
- function语句形式声明后会占用内存,但是构造函数形式定义函数调用完毕后会从内存中清除;
- 用法:如果调用次数多就使用语句式,如果只调用一次就用构造函数式;
原因:构造函数每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