1、三种定义函数的方式
function语句形式
function test1(){
alert('我是test1');
}
test1();
函数直接量形式
var test2 = function(){
alert('我是test2');
}
test2();
通过Function构造函数形式定义函数
var test3 = new Function("a" , "b" ,"return a+b;");
alert(test3(10,20));
2、三种方式效率比对
function语句形式和函数直接量形式一次加载进内存,只创建一次,占用内存,效率快
通过Function构造函数形式定义函数使用一次创建一次,效率慢
测试:
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);
结果:
100000万次循环
function test1(){;}只用了10~20毫秒效率快
new Function()用了80~100毫秒效率慢
3、三种方式解析顺序 比对
function语句形式优先解析
函数直接量形式和通过Function构造函数形式定义函数是顺序解析
测试:
function test1(){
alert('1111');
}
test1();
var test2 = function(){
alert('2222');
}
test2();
结果:
弹出111
弹出222
说明从上到下顺序执行都是没问题的
test1();
function test1(){
alert('1111');
}
test2();
var test2 = function(){
alert('2222');
}
结果:
弹出111
控制台输出:Uncaught TypeError: test2 is not a function
at 1.html:17
test1可以理解为window的一个变量,并且知道是一个函数,javascript解析器会优先的解释,直接调用没问题
test2也可以理解为window声明的一个变量,但是还没有被赋值,直接调用报错,因为还不知道它是一个函数
4、三种方式作用域方面 比对
function语句形式和函数直接量形式都具有函数的作用域
通过Function构造函数形式定义函数具有顶级函数(顶级作用域)
测试:
var k = 1 ;
function t1(){
var k = 2 ; //局部变量 k
function test(){return k ;} //function语句
// var test = function(){ return k}; //函数直接量
//var test = new Function('return k;'); // 构造函数的方式
alert(test());
}
t1();
结果:
function test(){return k ;} 输出2 函数作用域
var test = function(){ return k};输出2 函数作用域
var test = new Function(‘return k;’);输出1 顶级作用域
总结:
三种方式创建函数的比较
比较方向 | function语句 | Function构造函数 | 函数直接量 |
---|---|---|---|
兼容 | 完全 | js1.1以上 | js1.2以上 |
形式 | 句子 | 表达式 | 表达式 |
名称 | 有名 | 匿名 | 匿名 |
性质 | 静态 | 动态 | 静态 |
解析时机 | 优先解析 | 顺序解析 | 顺序解析 |
作用域 | 具有函数作用域 | 顶级函数(顶级作用域) | 具有函数作用域 |