標籤:call err 原始碼 array on() 執行個體 高階函數 element jquery
函數在js中扮演了幾個角色?
- 建構函式
建構函式主要用來執行個體化對象
- 普通函數
一般普通函數都是用來實現某一個特定的功能
- 作為對象
函數可以作為一個普通對象使用
總結:函數到底扮演什麼角色取決於函數的調用方式
函式宣告的方式:
- 內建函數(內建對象、庫函數)Object、Array、Data、RegExp、String、Number、Boolean、Error、Function
- 自訂函數
- 函式宣告 (有預解析,可以先調用再聲明)
- 函數運算式 (沒有預解析存在,必須先聲明再調用)
下面的代碼只會在記憶體中產生一個函數 節省記憶體 結果為1的函數
下面的代碼不可以使用,不規範,不能形成隔離的空間,在不同的瀏覽器中的處理方式不一樣,且佔用空間,用運算式更節省記憶體
- new Function()產生一個函數 (一般情況下用不到)
如果函數沒有參數,那麼Function的參數表示函數體
如果函數有參數,那麼Function最後一個參數表示函數體,之前的表示實際參數
以上的new Function()產生函數的缺點:代碼的可讀性較低的,效能比較低,函數體是字串,有一個字串轉成js代碼的過程比較耗時
new Function()產生函數的優點:可以動態解析js字串形式的代碼---類似於eval()的用法
eval()有安全隱患,推薦用JSON.parse()
函數調用的方式:
- 建構函式執行個體化
- 普通函數調用
- 對象方法調用
- call和apply
這種情況調用, 三者等效
參數處理上:call參數是單個的,apply參數是數組
call/apply的用法:
- 調用函數
- 改變所調用函數內部this的指向
bind方法的基本使用(ES5新特性),作用也是改變函數內部this的指向
傳參:
應用:bind會返回一個新的函數
==
- 借用其他對象的方法
- 把類數組轉成數組
什麼是類數組?
類數組是一個對象:對象的鍵是整數形式的索引,與數組的鍵類似;必須有length屬性,length屬性的值與索引形式的索引值對的個數相同
注意:類數組不是數組,並且不可以調用數組的方法
可以添加資料,但是length的值不會自動改變
類數組轉化:
類數組情境1:document.getElementsByTagName
轉化:
添加並調用api:
類數組情境2:jQuery
類數組情境3:arguments
arguments本質是類數組,arguments.length表示實參的個數,
滑鼠事件:
- 函數立即調用
傳參:
window作為實參的用意:提高效能;方便代碼壓縮,節省頻寬
undefined作為形參的用意:防止undefined的值被修改(早期的低版本瀏覽器中)
jQuery原始碼最外層就是這樣做的
關於this
this到底指向誰取決於函數調用的方式
this出現的情境:
- 普通函數中的this
在非strict 模式下,this指的是window,在strict 模式下,this指的是undefined
window
strict 模式:對文法規則要求更加嚴格
- 建構函式中的this
- 原型方法中的this
建構函式中的this與原型方法中的this指向相同,都指向執行個體對象
lisi lisi
- 對象方法中的this
對象方法中的this就是方法的調用者
hello
- 定時函數中的this
定時函數中的this值就是window
window
- 事件函數中的this
事件函數中的this指的是綁定事件的對象
input
何時需要緩衝this?
this的指向發生改變的時候
例子:
高階函數
- 函數作為參數
hellojerry
lisi
- 函數作為傳回值
123
111
關於sort 方法排序:
JS函數強化