關(guān)于函數(shù)的基礎(chǔ)知識以及一些案例的總結(jié)
<!DOCTYPE?html>
<html?lang="en">
<head>
<meta?charset="UTF-8">
<meta?name="viewport"?content="width=device-width, initial-scale=1.0">
<meta?http-equiv="X-UA-Compatible"?content="ie=edge">
<title>Document</title>
</head>
<body>
</body>
<script>
//函數(shù)
// 概念:由一堆代碼組成肠骆,實現(xiàn)一些特定的功能,通過函數(shù)自身和一些事件實現(xiàn)
//函數(shù)的創(chuàng)建
// 1,聲明式
// function fn(){}
// function:聲明函數(shù)的關(guān)鍵字
// fn:函數(shù)名
// ():存放函數(shù)的形參
// {}函數(shù)體收班,函數(shù)的執(zhí)行語句
// fn() 函數(shù)的執(zhí)行
// 難點:回調(diào)函數(shù)
// function fn(a){
// console.log(a);
// a(function(c){
// console.log("hello")
// c();
// })
// }
// fn(function(b){
// console.log(b);
// b(function(){
// console.log("腦袋疼")
// })
// })
// fn()將function(b){console.log(b)}作為實參傳給了函數(shù)fn 此時(a)接受到的相當于a=function.log(b){console.log(b)}
// 這就相當于一個新的函數(shù)a;此時執(zhí)行a()相當于執(zhí)行函數(shù)a故痊,如果實參a()里面還是一個新的函數(shù),那個就相當于創(chuàng)建了一個新的函數(shù)b,就是b=function(c){console.log("hello")}
// 這樣子執(zhí)行b()執(zhí)行了函數(shù)b 得到了hello的值
// 函數(shù)的實參與形參的關(guān)系
// 1看靠,實參與形參之間一一對應(yīng)
// 2赶促,當實參多余形參時,實參存放在arguments中
// 3挟炬,當形參多余實參時鸥滨,多余的形參為underfind,因為這些形參聲明了但未經(jīng)過實參的賦值
// arguments的用法:
// 定義:arguments是函數(shù)中的一個數(shù)組谤祖,專門用來存放函數(shù)中的實參婿滓,只有在函數(shù)中才能獲取
// demo:
// 1.任意個數(shù)字的和
// function fn(){
// var sum=0;
// for(var i=0;i<arguments.length;i++){ //注意:這里的i代表的不是數(shù)組,而是由arguments 數(shù)組的序列號 由0 開始到arguments.length-1;
// sum+=arguments[i]
// }
// console.log(sum);
// }
// fn(3,2,34,36,242);
// demo:
// 1.讓三個不同大小的數(shù)字粥喜,按照由大到小的順序依次打印出
// function fn(a,b,c){
// if(a>b&&a>c){
// if(b>c){
// console.log(a,b,c);
// }else{
// console.log(a,c,b);
// }
// }else if(b>a&&b>c){
// if(a>c){
// console.log(b,a,c);
// }else{
// console.log(b,c,a);
// }
// }else if(c>a&&c>b){
// if(a>b){
// console.log(c,a,b);
// }else{
// console.log(c,b,a);
// }
// }
// }
// fn(7,4,6)
// 作用域:變量生效的區(qū)域
// 作用域的分類:
// 全局:整個代碼的區(qū)域
// 局部:一個函數(shù)就是一個局部
// 全局作用域下的變量叫做全局變量
// 局部作用域下的變量叫做局部變量
// 函數(shù)的形參也是一個變量凸主,函數(shù)是一個局部作用域,所以形參是一個局部變量
// 變量的生命周期:
// 全局變量:一直存在额湘,隨時可以被取用
// 局部變量:隨著函數(shù)的運行開始而開始卿吐,函數(shù)的結(jié)束而結(jié)束
// 提升:
// 1,變量的提升锋华;使用var聲明的變量嗡官,會提升到當前作用域開始的位置,被聲明供置,在原位賦值
// 2谨湘,函數(shù)的提升:只要使用function聲明的函數(shù),都會整體提升芥丧,在當前作用域內(nèi)都可以被使用
// 但是使用賦值式創(chuàng)建的函數(shù)紧阔,提升的是聲明,而不是函數(shù)
// 當函數(shù)名與變量同名時续担,變量會在函數(shù)上面的位置擅耽,導(dǎo)致函數(shù)生效;
function?fn(){
console.log(a); //f2
var?a = "hello";
console.log(a); //"hello"
function?a(){1}
console.log(a); //"hello"
a = "world";
console.log(a); //"world"
function?a(){2}
console.log(a); //"world"
}
// 以上的式子相當于
// function fn(){
// var a;
// function a(){1}
// function a(){2}
// console.log(a); //f2
// a = "hello";
// console.log(a); //"hello"
// console.log(a); //"hello"
// a = "world";
// console.log(a); //"world"
// console.log(a); //"world"
// }
// fn();
// 重點N镉觥乖仇!函數(shù)的遞歸:
// 遞歸實質(zhì)上就是一個死循環(huán)憾儒,重要的是他的停止條件,這時就需要return來幫助函數(shù)終止運行
// demo:
// 1.計算5的階乘
// function fn(n){
// if(n==1){
// return 1;
// }else{
// return n*fn(n-1);
// }
// }
// console.log(fn(3));
// 2.用遞歸計算1,1,2,3,5,8,13....
// function fn(n){
// if(n==1||n==2){
// return 1;
// }else{
// return fn(n-2)+fn(n-1);
// }
// }
// console.log(fn(3));
// 3.求一個數(shù)的最大公約數(shù)
// function fn(m,n){
// var r=m%n;
// m=n;
// n=r;
// if(r==0){
// return m;
// }else{
// return fn(m,n);
// }
// }
// console.log(fn(24,6));
// 遞歸的總結(jié)乃沙,遞歸是一個遞和歸的過程起趾,在歸的過程中,判斷遞的條件警儒,不成立的話將fn(m,n)再進入到函數(shù)中
// 執(zhí)行一次训裆;
// 遞歸實質(zhì)上就是一個死循環(huán)
// 遞歸的樣式如下
// function fn(){
// fn();
// }
// fn();
// 所以說,讓遞歸停止的條件很重要
// 構(gòu)造函數(shù):
// 構(gòu)造函數(shù)是一種函數(shù)的存儲方式
// 數(shù)據(jù)的存儲方式:
// 1蜀铲,字面量 var a=123;
// 2,構(gòu)造函數(shù)边琉,var b=new Number(123);
// 重點 對象:對象是對事物的描述
// 對象的作用是存儲數(shù)據(jù)
// 對象的實質(zhì)就是鍵值對(屬性:屬性值)
// 鍵值對之間用,隔開
// 對象中的屬性叫做屬性
// 對象中的函數(shù)叫做方法名
// 語法:對象.屬性(方法名)
</script>
</html>