函数定义的方式有两种:一种是函数声明,别一种是函数表达式。函数声明的形式:
function foo(arg0,arg1,arg2){
//函数体
}
首先是函数关键字,然后是函数名字,这就是指定函数名的方式。函数声明的一个重要特征是函数提升,意思是在执行代码之前会先读取函数声明,所以能把函数声明放在调用他的语句后面。
foo();
function foo(){
console.log("hello world!");
}
//不会报错,因为在代码执行之前会先读取函数声明。
别一种创建函数的方式是使用函数表达式。
var foo = function(){
var a ="hello!";//私有变量,不能在函数外部访问。
//函数体
console.log("hello world!");
}
<====================================================>
foo(); //错误,函数不存在
var foo = function(){
console.log('1');
}
<====================================================>
var flag = true;
if(flag){
function foo(){
console.log("hello world1!");
}
}else{
function foo(){
console.log("hello world2!");
}
}
表面上看,以上代码表示flag在true时,使用foo定义,否则使用别一个foo定义。实际上,这在ECMAScript属于无效语法,js引擎会尝试修正错误,将其转换为合理的状态。但问题是浏览器尝试修正错误的做法不一致。大部分浏览器会返回第二个声明,忽略flag;而firefox则会返回第一个声明。如果使用函数表达式,则无这种问题。
var foo;
if(flag){
foo = function(){
console.log('1');
}
}else{
foo = function(){
console.log('2');
}
}
不同的函数会根据flag对函数进行赋值。