函数在js中也是一种数据类型,属于function类型
三种定义方式:
1.function语句的形式:
function test1(){
alert('1111');
}
2.函数直接量的形式:
var test2 = function(){
alert('2222');
3.构造函数的形式:
}
三种方式的比较:var test3 = new Function('a','b','return a+b')
最后一个参数是test3的函数体,前面的参数是test3的参数。
function语句形式 | 函数直接量形式 | 构造函数形式 | |
名称 | 有名 | 匿名 | 匿名 |
性质 | 静态 | 静态 | 动态 |
解析时机 | 优先解析 | 顺序解析 | 顺序解析 |
作用域 | 函数的作用域 | 函数的作用域 | 顶级作用域 |
解析顺序问题:
alert(f1()); // 3
//alert(f2()); //不能执行
function f1(){return 1;}
alert(f1()); // 3
alert(f2); // undefined 说明f2先声明后赋值的
var f2 = function(){return 2;}
alert(f2); // function
alert(f2()); // 2
function f1(){return 3;}
var f2 = new Function('return 4;')
alert(f2()); //4
f1优先解析,所以第一个alert()可以执行,而且前面的f1被后面的f1覆盖。只要函数名一样,后解析的就会覆盖前面的。
f2都是声明式定义,顺序解析,赋值之后才能调用f2()。
作用域问题:
var k = 1;
function f1(){
var k = 2;
//function f2(){return k;} // 2 函数作用域
//var f2 = function(){return k;} // 2 函数作用域
var f2 = new Function('return k;'); // 1 全局作用域
alert(f2());
}
f1();