JS函數
函數的封裝
傳統方式
function 函數名(){}
該方式的函數有“預加載”過程,允許我們先調用函數、再聲明函數
預加載:代碼先把函數的聲明放入內存。代碼看起來是先調用、後聲明,本質是先聲明、後調用的。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
getInfo();
function getInfo() {
console.log("hello");
}
</script>
</head>
<body>
</body>
</html>
函數先調用、後聲明的條件是,全部代碼在一個”<script>”標記裏邊。
如下所示:將會報錯
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
getInfo();
</script>
<script type="text/javascript">
function getInfo() {
console.log("hello");
}
</script>
</head>
<body>
</body>
</html>
變量賦值方式聲明函數(匿名函數使用)
var 函數名 = function(){}
該方式沒有“預加載”,必須先聲明、後調用。
<script type="text/javascript">
var getName=function () {
console.log("hello");
}
getName();
</script>
函數的參數
實參和形參的對應關係
在javascript裏邊:實參與形參沒有嚴格的對應關係
<script type="text/javascript">
function f1(name,age,addr='beijing') {
console.log("名字:"+name+" 年齡:"+age+" 地址:"+addr);
}
f1("csx",12);
f1("csx",13,"shanghai");
f1("csx");
f1();
</script>`
關鍵字arguments
利用arguments可以在函數裏邊接收實參信息。
<script type="text/javascript">
function f1() {
var len=arguments.length;
if(len==0){
console.log("個人信息:");
}else if(len==1){
console.log("個人信息:"+" 名字:"+arguments[0]);
}else if(len==2){
console.log("個人信息:"+" 名字:"+arguments[0]+" 年齡:"+arguments[1]);
}else if(len==3){
console.log("個人信息:"+" 名字:"+arguments[0]+" 年齡:"+arguments[1]+" 地址:"+arguments[2]);
}
}
f1();
f1("csx");
f1("csx",12);
f1("csx",13,"shanghai");
</script>
callee關鍵字
在函數內部使用:代表當前函數的引用
耦合:一處代碼的修改會導致其他代碼也要發生改變。 在程序項目裏邊要開發低耦合度的代碼。
<script type="text/javascript">
//callee可以降低代碼的耦合度
function jiecheng(n) {
if(n==1){
return 1;
}else{
return n*arguments.callee(n-1);
}
}
console.log(jiecheng(5));
console.log(jiecheng(6));
var jc=jiecheng; //把jiecheng函數的引用傳遞給變量jc一份,使得jc也可以當函數使用
jiecheng=null;//把jiecheng函數給銷燬,避免後面代碼使用
console.log(jc(7));
</script>
函數返回值
函數返回,使用return關鍵字返回信息
return可以返回全部的數據類型,return本身還可以結束函數的執行
return還可以返回一個對象,因爲函數是對象,所有也可以返回函數
<script type="text/javascript">
function f1() {
var name="csx";
var age=12;
var addr="beijing";
//內部嵌套函數
function f2() {
console.log("I am f2");
}
return f2;//把函數返回
}
var ff=f1();//f1執行完畢後的返回值被ff接受
//一個對象(f1()的返回值)對另一個變量賦值,是引用傳遞
ff();
</script>
f2和ff是兩個不同的引用,但是都指向同一個函數體
函數調用
傳統方式調用
函數名()
匿名函數自調用
(function(){})()
<script type="text/javascript">
var f1=function () {
console.log("f1f1f1");
}
var f1="tom";//同名的f1把上面的函數給覆蓋/污染了
f1();
//匿名函數自調用,好處:本身不會被同名變量污染
(function () {
console.log("hello");
})();
(function () {
console.log("地址是:"+addr)
})("北京");
</script>
匿名函數自調用,好處:本身不會被同名變量污染
全局/局部變量
- 全局變量
① 在函數外部聲明的變量
② 函數內部不使用“var”聲明的變量(函數調用之後起作用)
<script type="text/javascript">
//全局變量:函數外部聲明
var name="csx";
function f1() {
console.log("name:"+name);
name="ccc";
}
f1();
console.log("name:"+name);
function f2() {
//全局變量:函數內部不使用"var"聲明(函數調用後起作用)
age=12;
console.log("age:"+age);
}
f2();
age=18;
console.log("age:"+age);
</script>
- 局部變量
在函數內部聲明的變量,變量前邊有”var“關鍵字。