首先函式(function)也是一個物件
函式有哪些性質呢?
1,函式中可以封裝一些功能(代碼),在需要的可以執行這些功能(代碼)
2,封裝的代碼不會立即執行,只會在函式呼叫的時候立即執行,
那我們該怎樣創建一個函式物件呢?
var fun = new function()
(但我們實際開發中很少用到這種方法)
我們一般都是使用函式宣告來創建函式的,
方式一
function 方法名(){
//需要執行的代碼
}
方式二
ES6中宣告方式中的箭頭函式()=>{}
方法三
匿名函式,將函式存到變數里
var func=function(){}
創造函式后,我們該怎么呼叫呢?
1,名字();函式可以多此呼叫
//函式申明
function fun(){
console.log("hello")
}
//函式呼叫
fun()
2,在事件中呼叫,
//函式宣告
function fun(){
console.log("hello");
}
document.onlick =fun;
除此之外還有些特別的函式
匿名函式
function(){}
立即執行函式
函式在定義完后立即被呼叫,這種函式叫立即執行函式
這種函式只執行一次(后面就找不到了)
(
function(){
alert('我是一個函式')
}
)()
函式運算式
var 函式名([形參1,形參2]){}
(所以我們可以把者看成一個匿名函式賦值給一個變數)
函式的引數
多個形參之間使用逗號隔開,形參宣告就相當于在函式內部宣告了對應的變數,但是并不賦值,
(
呼叫時候不會決議器不會檢查實參的型別,以及數量,
多余的實參不會被呼叫
但如果是擦的數量少于形參的數量,形參沒有對應的實參,則會顯示underfined
)
函式的回傳值
可以用return來設定函式的回傳值
語法:return 值
return后的值江湖作為函式的執行結果回傳
函式中的return后的陳述句都不會執行
如果return后不加任何值,則會回傳undefined
不寫return 也會回傳 undefined
語言精粹
函式物件
在JavaScript中函式就是物件,物件是“名/值”對的集合并擁有一個連到原型物件的隱藏連接,物件字面量產生的物件連接到Object.prototype,函式物件連接到Funtion.prototype(該原型物件本身連接到Object.prototype),每個函式在創建時附有兩個附加的隱藏屬性:函式的背景關系和實作函式行為的代碼,
(
原型prototype
我們創建的每一個函式,決議器都會像函式中添加一個屬性prototype,這個屬性對應著一個物件,這個物件就是我們所謂的原型對像,
原型物件就相當于一個公共的區域,所有同一個類的實體都可由訪問到這個原型物件,我們可以將物件中共有的內容,統一設定到原型物件中,
我們訪問物件中的一個屬性或方法時,它會現在對像自身中尋找,如果有直接使用,如果沒有則會去原型物件中尋找,如果找到則直接使用,
)
函式字面量
函式物件可以通過函式字面量來創建:
var add = function(a,b){
return a+b;
}
第一部分,關鍵字function
第二部分,函式名,但它可被省略,若沒有則為匿名函式,函式名可以呼叫直接自己,此名字也能被除錯器和開發工具來識別函式,
第三部分,包含在括號內的引數,雖然引數可有可無,但括號不可少,若有引數,則每個引數用逗號分隔,這些名稱將被定義為函式中的變數,它們不像普通的變數那樣將被初始化為undefined,而是在該函式被呼叫時初始化為實際提供的引數值,
第四部分是包圍在花括號中的一組陳述句,這些陳述句是函式的主體,他們在函式被呼叫時執行,
呼叫
呼叫一個函式將暫停當前函式的執行,傳遞控制權和引數給新的函式,
除了宣告時定義的形式引數,每個函式接受兩個附加的引數:this和arguments
(
決議器在呼叫函式每次都會像函式內部傳遞一個隱晦引數,這個隱含的引數就是this
this就是一個引數,它會指向的時一個物件,
根據函式的呼叫方式不同,this會指向不同的物件,(和創建方式無關)
1以函式的方式呼叫,this永遠是window
2以方法的函式呼叫,this就是 呼叫方法的那個物件
可以說this 指的時函式運行時所在的環境,
還有個隱晦引數 arguments
argument時一個類陣列物件,它可以通過索引引來操作資料,也可以獲取長度,
呼叫函式時,我們所傳遞的實參都會在arguments中保存
argument.lenght可以用來獲取實參的長度
argument[0],表示第一個實參
argument[1],表示第二個實參
)
在JS中一共有四種呼叫模式:
方法呼叫模式,函式呼叫模式,構造器呼叫偶數和apply呼叫模式,這些模式在如何初始化關鍵引數this上存在差異,
圓括號內可包含零個或多個逗號隔開的運算式,每個運算式產生一個引數值,每個引數值被賦予函式宣告時定義的形式引數名,
方法呼叫模式
呼叫背景關系為當前物件,即this指向當前物件
var calculator={
value:1,
value:2,
add:function(){
this.result=this.value1+this.value2;
}
};
calculator.add()//呼叫add方法計算結果
calculator.result//=>2
函式呼叫方法
非嚴格模式下的呼叫背景關系(this的值)是全域物件,嚴格模式this為undefined
function myFunction(){
return this;
}
myFuction();//回傳window物件
建構式呼叫
如果函式或者方法呼叫之前帶有new關鍵字,它久構成建構式呼叫,
建構式呼叫會創建一個新的空物件,并初始化這個物件,將這個物件用作其呼叫背景關系,
間接呼叫
call()和apply()方法
call()和apply()是去定義的函式方法,兩個方法可用于呼叫函式,兩個方法的第一引數是要呼叫函式的母物件,它是呼叫背景關系的,
引數
當函式被呼叫時,會得到一個‘免費’奉送的引數,那就是arguments陣列,
1arguments是一個類陣列物件,用來存盤實際傳遞給函式的引數,使用函式時不局限于函式宣告所定義的引數串列,
2訪問實參和檢查實參個數
arguments訪問單個引數的方式和訪問陣列元素的方式相同,
例如:arguments[0],arguements[2],arguments[n],在函式中不需要明確指出引數名,就能訪問它們,通過length屬性可以知道實參的個數,
console.log(arguments[0]);
console.log(arguments[n]);
console.log(arguments.length);
回傳
當一個函式被呼叫時,它從第一個陳述句開始執行,并在遇到關閉函式體的 } 時結束,那使得函式把控制權交還給呼叫該函式得程式部分,
return陳述句可以來使函式提前回傳,但return被執行時,函式立即回傳而不在執行余下得陳述句,
一個函式總是回傳一個值,如果沒有指定回傳值,則回傳undefined
如果函式以上在前面加上new 前綴得方式來呼叫,且回傳值不是一個物件,則回傳this(該新物件),
例外
JavaScript提供了一套例外處理機制,例外是干擾程式得正常流程得非正常(但并非完全是出乎意料)的事故,當查出這樣的事故時,你的程式應該拋出一個例外,
Throw
throw expression
throw陳述句用來拋出一個用戶自定義的例外,當前函式的執行將被停止(throw之后的陳述句不會被執行),并且控制將被傳遞到呼叫堆疊中的第一個catch塊,如果呼叫者函式中沒有catch塊,程式將會終止,
Try/catch
它們主要用于捕捉例外,try/catch陳述句包含一個try塊,和至少有一個catch或者一個finally塊,下下面時三種形式的try宣告:
try...catch
try...finally
try...catch...finally
遞回
遞回函式會直接或間接地呼叫自身地一種函式,
遞回是一種強大的編程技術,它將一個問題分解為一組相似的子問題,每一個都用一個尋常解去解決,一般來說,一個遞回函式呼叫自身去解決它的子問題,
數字遞回
每一個遞回函式都需要一個終止條件,從而使其不會無休止地回圈下去,然而,僅僅加一個終止條件,是不足以避免其無限回圈地,該函式必須一步步地接近終止條件,在遞回步驟中,問題會逐步簡化為更小地問題,
陣列遞回
與數字遞回類似,我們可以每一步遞減陣列中的元素個數,直到獲得一個空陣列,
作用域
作用域是在運行時代碼中的某些特定部分中變數,函式和物件的可訪問性,換句話說,作用域決定了代碼區塊中變數和其他資源的可見性,
簡單說:作用域就是個獨立的地盤,讓變數不會外泄和暴露出去,
它最大的作用就是隔離變數,不同作用域下同名變數不會有沖突,(塊級元素在ES6中才有)
全域作用域有
-最外層函式和最外層函式外面定義的變數擁有全域變數
-所有未定義直接賦值的變數自動宣告為擁有全域作用域
-所有window物件的屬性擁有全域作用域
注意:塊陳述句(大括號{} 中間的陳述句),如if和swich條件或for和while回圈陳述句,不像函式,它們不會創建一個新的作用域
塊級作用域
在一個函式內部
在一個代碼塊(由一對花括號包裹)內部
閉包
閉包的簡單理解就是內嵌函式,也即是函式中嵌套函式
形成:函式中嵌套函式
作用:函式內部呼叫外部變數、建構式的私有屬性、延長變數生命周期
優點:希望一個變數長期存在記憶體中、模塊化代碼避免全域變數污染,私有屬性,
缺點:無法回收閉包中參考變數,容易造成記憶體泄漏,
回呼
回呼函式是作為引數傳給另一個函式的函式,然后通過在外部函式內部呼叫該回呼函式以完成某種操作,
簡單說:回呼函式就是一個函式,將會在另一個函式中完成執行后立即執行,回呼函式是一個作為引數傳給另一個Javascript函式的函式,這個回呼函式會在傳給函式內部執行,
為啥我們需要回呼
客戶端JavaScript在瀏覽器中運行,并且瀏覽器中的主行程是單執行緒事件回圈,如果我們嘗試在單執行緒回圈中執行長時間運行的操作,會阻止該程序,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/289307.html
標籤:其他
上一篇:Javascript學習筆記
下一篇:淺學JavaScript01
