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!”