函數的一些理論知識 1. 函數: 執行一個明確的動作並提供一個返回值的獨立代碼塊。同時函數也是javascript中的一級公民(就是函數和其它變數一樣)。 2.函數的聲明方式: 1> 函數聲明:在函數里,必須手動去聲明函數的返回值,如果返回值沒有申明,則此函數返回值為undefined,,retur ...
函數的一些理論知識
1. 函數:
執行一個明確的動作並提供一個返回值的獨立代碼塊。同時函數也是javascript中的一級公民(就是函數和其它變數一樣)。
2.函數的聲明方式:
1> 函數聲明:在函數里,必須手動去聲明函數的返回值,如果返回值沒有申明,則此函數返回值為undefined,,return是函數內部使用的,形參能自動聲明,而實參不能自動聲明為undefined。我們在調用函數時要:函數+()這種形式。不然就是函數本身。function fn(){console.log("welcome");}
2>函數表達式:例如var fun=function(){console.log("hello");}
3>立即執行函數(IIFE):例如(function(){})()
4>創建FUNCTION對象:例如 var func=new Function("one","two","return one+two");
anguments:不是數組,卻有數組的相關屬性,是一個偽數組,類似元素集合,就算沒有定義形參,一旦把實參傳進函數,也可以訪問到,例如:length。
3.值傳遞和引用傳遞的區別:
1>值傳遞:聲明的是原始的類型,具體的值,傳給變數後,就與它本身沒有關係了。
2>引用傳遞:把地址傳給變數,傳完後變數的值會跟據變數的變化而變化 。
4.可執行代碼和執行上下文:
1>可執行代碼:全局代碼、函數代碼、eval()代碼(出於安全著想,一般不建議使用此類代碼)
2>執行上下文:執行代碼的一個環境,環境會隨著代碼結束而結束,執行代碼不斷產生執行上下文環境。js中量聲明給它的位置無關(變數提升),塊作用域(js中沒有這個作用域)
5.變數和變數的初始化:
當一個變數在聲明時,就把變數存在變數對象中,變數對象(vo) #
如果沒有給一個變數定義卻給它賦值,那變數就會成全局變數了。例如:a=b,前提又沒有給a定義。
6.作用域(鏈):
當一個範圍里沒有給這個變數定義時,我們就會上一層找,那麼我們為啥函數能往上一層找啊?
因每一個作用域對象中有一個vot和scope,而每一個scope保存上一層的vo(變數對象).scope對象是在函數聲明時,它就已經存在了,是它所在的作用鏈的對象,
7.this關鍵字:
1>在一個函數中用this,一般把window
2>當你的對象中再嵌套一個函數,此this指的是window,除非在對象中用一臨時變數來保存this,那麼此時的this就用臨時變數替代,這時的this就指的是標簽對象而不是window.
3>如果我們以這種形式下的this就是反映對象本身了,例如:$("#aa").click(function(){})
8.call和apply關鍵字的區別:
相同點:都可以改變thisr的指向。
不同點:傳參方式不一致。call是傳的參列表。apply是傳的數組。
9.閉合:
可以把局部變數持續保存。可以不在使用全局變數條件下用局部變數讓變數一直保存。
閉全滿足的條件:1>在一個函數內部寫一個函數,並訪問局部變數
2>這個函數可以被外部訪問到(引用)
閉舍的好處:持續保存,還會被其它引用。