函數是由事件驅動的或是當它被呼叫時執行的可重複使用的程式碼區塊。
Jscript 支援兩種函數:一類是語言內部的函數(如eval() ),另一類是自己建立的。
在 JavaScript 函數內部宣告的變數(使用 var)是局部變量,所以只能在函數內部存取它。 (此變數的作用域是局部的)。
您可以在不同的函數中使用名稱相同的局部變量,因為只有宣告過該變數的函數才能辨識出該變數。
函數的呼叫方式
1、普通呼叫:functionName(實際參數...)
2、透過指向函數的變數去呼叫:
var myVar = 函數名稱;
myVar(實際參數...);
傳回函數的函數
1. 當函數無明確傳回值時,傳回的值就是"undefined"。
2. 當函數有回傳值時,傳回值是什麼就會回傳什麼。
我們可以透過使用 return 語句實作將函數傳回呼叫它的地方。
使用 return 語句時,函數會停止執行,並傳回指定的值。
函數通常會回傳一個唯一值,那麼這個值也可能是另一個函數:
在這裡,我們只需將返回值賦值給某個變量,然後就可以像使用一般函數那樣調用它了:
如果想讓傳回的函數立即執行,也可以使用box()()來執行這段程式碼。
ECMAScript所有函數的參數都是按值傳遞的,言下之意就是參數不會按引用傳遞。
PS:如果存在按引用傳遞的話,那麼函數裡的那個變數將會是全域變量,在外部也可以存取。
(1)值類型:數值、布林值、null、undefined。
(2)引用類型:物件、陣列、函數。
引用類型值:指的是那些保存在堆內存中的對象,意思是,變量中保存的實際上只是一個指針,這個指針執行內存中的另一個位置,由該位置保存對象;
建立匿名函數
這種匿名函數的用法在JQuery中非常多。直接聲明一個匿名函數,立即使用。用匿名函數的好處就是省得定義一個用一次就不用的函數,而且免了命名衝突的問題,js中沒有命名空間的概念,因此很容易函數名字衝突,一旦命名衝突以最後聲明的為準。
透過自我執行來執行匿名函數:
把匿名函數自我執行的回傳值賦給變數:
自我執行匿名函數的傳參:
javascript建立動態函數:
JavaScript支援建立動態函數,動態函數必須用Function物件來定義(Function是javascript中的一個對象,是固定不變的,規定Function對象的"F"必須大寫,當是function的時候,我們知道是定義函數的時候所使用的一個關鍵字:function funName(x,y),當是Function的時候(F大寫的時候),我們知道是javascript中的物件)
建立動態函數的基本格式:var 變數名稱 = new Function("參數1","參數2","參數n","執行語句");
看下面的一段程式碼:
square是動態創建的函數,在Function物件後面的括號裡的每一部分內容都必須是字串形式的,也就是說都必須用引號(""或者是'')括起來
這段程式碼:
var square = new Function ("x","y","var sum ; sum = x y;return sum;");
和下面這段程式碼:
是一摸一樣的,只不過一個是動態函數,一個是靜態函數。
我們為什麼要把程式碼分成一小段一小段的程式碼呢? ,把一個字串分成了若干個獨立的字串的優點就在於我們可以透過修改其中的某些字串來隨時改變函數的作用。
回呼函數
回呼就是一個函數的呼叫過程。那就從理解這個呼叫過程開始吧。函數a有一個參數,這個參數是個函數b,當函數a執行完以後執行函數b。那麼這個過程就叫回調。
其實中文也很好理解:回調,回調,就是回頭呼叫的意思。函數a的事先幹完,回頭再呼叫函數b。
這裡必須清楚一點:函數b是你以參數形式傳給函數a的,那麼函數b就叫回呼函數。
在jquery裡的絕大多數效果函數都涉及callback函數。 jquery效果函數
例如:
這裡的callback function換成實例可以是:
Callback其實是,當一個函數執行完後,現執行的那個函數就是所謂的callback函數。怎麼樣?很好理解吧…
方法和函數的差別
其實方法就是函數,只不過方法是有所屬的物件。
我們所熟知的,將函數綁定到 click 事件
語法:
$(selector).click(function)
參數 描述
function 可選。規定當發生 click 事件時執行的函數。
這種形式在jquery中經常見到。它是將function當做該方法的參數,並為該方法添加一個事件處理函數。
js全域函數
全域函數與內建物件的屬性或方法不是一個概念。全域函數它不屬於任何一個內建物件。
JavaScript 中包含以下 7 個全域函數,用於完成一些常用的功能:
escape( )、eval( )、isFinite( )、isNaN( )、parseFloat( )、
parseInt( )、unescape( )。
函數的幾個作用
作為一個類別構造器使用
作為閉包使用
作為建構子呼叫
所謂建構函數,就是透過這個函數產生一個新物件(object)。
可以使用 new 運算子結合像 Object()、Date() 和 Function() 這樣的預先定義的建構子來建立物件並對其初始化。物件導向的程式設計其強有力的特徵是定義自訂建構函數以建立腳本中使用的自訂物件的能力。創建了自訂的建構函數,這樣就可以建立具有已定義屬性的物件。下面是自訂函數的範例(注意 this 關鍵字的使用)。
呼叫 Circle 建構函式時,給出圓心點的值和圓的半徑(所有這些元素是完全定義一個獨特的圓物件所必需的)。結束時 Circle 物件包含三個屬性。下面是如何例示 Circle 物件。
var aCircle = new Circle(5, 11, 99);
使用建構器函數的好處在於,它可以再建立物件時接收一些參數。
以下兩種形式的定義函數方式是等價的。
這裡明確定義了一個變數test,他的初始值被給了一個function實體
看看下面這種定義式函數形式:
很顯然,第一個函數並沒有起到作用,很奇怪不是嗎?我們知道,javascript解析引擎並不是一行一行地執行程式碼,而是一段一段地執行程式碼。在同一段程式的分析執行中,定義式的函數語句會被優先執行,所以第一個定義的程式碼邏輯已經被第二個覆蓋了,所以兩次呼叫相同函數,只會執行第二個。
作為值的函數
函數在js中不僅是一種語法,也是一個值。也就是說可以將函數賦值給變量,儲存在物件的屬性或數組的元素中,作為參數傳入另一個函數中。
函數的名字實際上是看不見的,它只是變數的名字,這個變數指涉函數物件
除了可以將函數賦值給變量,同樣可以將函數賦值給物件的屬性,當函數作為物件的屬性呼叫時,函數就稱為方法
prototype屬性
每一個函數都包含prototype屬性,這個屬性指向一個物件的引用,這個物件稱為原型物件。
詳見:javascript學習筆記(五)原型與原型鏈
高階函數
這裡的高階函數可不是高數裡的那個高階函數,所謂高階函數就是操作函數的函數,它接收一個或多個函數作為參數,並傳回新函數