函数定义的三种方式:
一、 函数声明
function add(i,j){
return i+j;
}
函数声明的特点:
1)函数定义会被前置;
2)重复定义函数时,最后一次函数定义有效。
二、函数表达式
var add=function(i,j){
return i+j;
}
三、函数实例化
var add=new Function("i","j","return(i+j)");
add(2,3);
函数实例化特点:定义的函数只能访问本地作用域和全局作用域。
函数声明的特点:
1、函数调用可以在函数定义之前执行,函数定义前置到顶部
函数表达式:
函数调用在函数定义之前报错,函数未定义。(但用Firebug调试执行正常,可能因为Firebug修改过底层)
add(1,2);
function add(i,j){
return i+j;
}//3
add(1,2);
var add=function(i,j){
return i+j;
} //add is not a function(…)
函数声明为什么可以在函数定义之前调用函数呢?
函数执行的顺序:
add(1);
function add(i){
console.log(i+1);
}
var add2=function(i){
console.log(i+2);
add2(1);
var add3=new function("i")
add3(1);
实际执行顺序:
函数声明:函数定义会前置到顶部。
函数表达式和函数实例化定义的函数:变量声明前置到顶部,变量赋值还在原位置。
var add2;
var add3;
function add(i){console.log(i+1);}
add(1);
add2=function(i){console.log(i+2);}
add2(1);
add3=new function("i")
add3(1);
2、函数声明:重复定义函数时,函数声明执行最后一次定义的函数。
函数表达式和函数实例化重复定义不影响。
function add1(i){
console.log("函数声明:"+(i+1));
}
add1(1);//11
var add2 = function(i){
console.log("函数表达式:"+(i+2));
}
add2(1);//3
var add2 = function(i){
console.log("函数表达式:"+(i+20));
}
add2(1);//21
function add1(i){
console.log("函数声明:"+(i+10));
}
add1(1);//11
var add3 = new Function("i","console.log('函数实例化:'+(i+3));");
add3(1);//4
var add3 = new Function("i","console.log('函数实例化:'+(i+30));");
add3(1);//31
如果几种定义函数的方式一起重复定义某函数,函数如何执行呢?
function add1(i){
console.log("函数声明:"+(i+1));
}
add1(1);
var add1 = function(i){
console.log("函数表达式:"+(i+2));
}
add1(1);
function add1(i){
console.log("函数声明:"+(i+10));
}
add1(1);
执行结果:
函数声明:11
函数表达式:3
16 函数表达式:3
为什么是这样呢?根据上面提到的函数声明的特点来分析一下。
首先,函数预执行之前,函数声明的函数定义前置到顶部。上面的代码真正的执行顺序是:
var add1;
function add1(i){
console.log("函数声明:"+(i+1));
}
function add1(i){
console.log("函数声明:"+(i+10));
}
add1(1);//11。执行的是上面的函数
add1 = function(i){
console.log("函数表达式:"+(i+2));
}
add1(1);//3
add1(1);//3
函数实例化定义函数的特点:
定义的函数只能访问本地作用域和全局作用域。
var person = {name:"刘德华", age:50};
(function(){
var person = {name:"刘德华", age:30};
var func = new Function("var person = {name:'刘德华', age:10};\
console.log(person.name+person.age+'岁');");
func();
})();\\刘德华10岁。“\”何解?
var person = {name:”刘德华”, age:50};
(function(){
var person = {name:”刘德华”, age:30};
var func = new Function(“console.log(person.name+person.age+’岁’);”);
func();
})();//刘德华50岁