•三种定义函数的方式:
–function语句形式
–函数直接量形式
–通过Function构造函数形式定义函数
•比较三种方式定义的区别:
function语句 | Function构造函数 | 函数直接量 | |
兼容 | 完全 | js1.1以上 | js1.2以上版本 |
形式 | 句子 | 表达式 | 表达式 |
名称 | 有名 | 匿名 | 匿名 |
性质 | 静态 | 动态 | 静态 |
解析时机 | 优先解析 | 顺序解析 | 顺序解析 |
作用域 | 具有函数的作用域 | 顶级函数(顶级作用域) | 具有函数作用域 |
/*----------------------函数效率对比--------------------*/
var date = new Date();
var d1 = date.getTime();
for(var i=0; i<100000; i++){
function test(){;}; //function语句形式效率更高
//var test2 = new Function();
}
var date2 = new Date();
var d2 = date2.getTime();
alert(date2 - date);
/*--------------------函数解析顺序----------------------*/
//function语句形式:优先解析,先解析function函数
test();
function test(){
console.log('语句形式,优先解析');
}
//函数直接量形式:顺序解析,先解析test2方法在解析函数
test2();
var test2 = function(){
console.log('直接量形式,顺序解析');
}
/*----------------------函数解析顺序--------------------*/
//第一个函数,返回4,说明第一个函数被第四个函数覆盖
function f(){
return 1;
}
console.log(f());
//第二个函数,返回2,说明第四个函数被第二个函数覆盖
var f = new Function("return 2")
console.log(f());
//第三个函数,返回3,说明第二个函数被第三个函数覆盖
var f = function(){
return 3;
}
console.log(f());
//第四个函数,返回3,说明第四个函数被第三个函数覆盖
function f(){
return 4;
}
console.log(f());
//第五个函数,返回5,说明第三个函数被第五个函数覆盖
var f = new Function("return 5")
console.log(f());
//第六个函数,返回6,说明第五个函数被第六个覆盖
var f = function(){
return 6;
}
console.log(f());
/*---------------------函数作用域的概念---------------------*/
var k = 1;
function t1(){
var k = 2;
//返回2
function test(){
return k;
}
//返回2
var test = function(){
return k;
}
//返回1
var test = new Function('return k');
console.log(test());
}
console.log(t1());