1、函数的基本概念(函数声明、函数表达式、匿名函数)

①函数的声明:function fnName () {…}; 使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
②函数表达式 var fnName = function () {…}; 使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
③匿名函数:function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数。

2、函数声明和函数表达式不同之处在于,一、Javascript引擎在解析javascript代码时会‘函数声明提升’(Function declaration Hoisting)当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式,二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。以下是两者差别的两个例子

fnName();
function fnName(){
  ...
}//正常,因为‘提升'了函数声明,函数调用可在函数声明之前

fnName();
var fnName=function(){
  ...
}//报错,变量fnName还未保存对函数的引用,函数调用必须在函数表达式之后

var fnName=function(){
  alert('Hello World');
}();//函数表达式后面加括号,当javascript引擎解析到此处时能立即调用函数
function fnName(){
  alert('Hello World');
}();//不会报错,但是javascript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用
function(){
  console.log('Hello World');  
}();//语法错误,虽然匿名函数属于函数表达式,但是未进行赋值操作,
//所以javascript引擎将开头的function关键字当做函数声明,报错:要求需要一个函数名

3、 代码块及js文件的处理
“代码块”是指一对标签包裹着的js代码,浏览器对每个块或文件进行独立的扫描,然后对全局的代码进行顺序执行

<script type="text/javascript"> 
Fn(); 
</script> 
<script type="text/javascript"> 
function Fn(){ 
alert("Hello World!"); 
} 
</script> //报错:Fn is notdefined,两个块换过来就对了 

4、 重复定义函数会覆盖前面的定义
和变量是一样的

function fn(){ 
alert(1); 
} 
function fn(){ 
alert(2); 
} 
fn(); // 弹出:“2” 

5、body的onload函数与body内部函数的执行
body内部的函数会先于onload的函数执行,body的onload事件触发条件是body内容加载完成,而body中的js代码会在这一事件触发之前运行

//html head... 
<script type="text/javascript"> 
function fnOnLoad(){ 
alert("I am outside the Wall!"); 
} 
</script> 
<body onload="fnOnLoad();"> 
<script type="text/javascript"> 
alert("I am inside the Wall.."); 
</script> 
</body> 
//先弹出“I am inside the Wall..”; 
//后弹出“I am outside the Wall!” 

本文转载:CSDN博客