1、概述
函數是由一連串的子程序(語句的集合)所組成的,可以被外部程序調用,向函數傳遞參數之後,函數可以返回一定的值。
通常情況下,JavaScript代碼是自上而下執行的,不過函數體內部的代碼則不是這樣。如果只是對函數進行了聲明,其中的代碼並不會執行,只有在調用函數時才會執行函數體內部的代碼。
這裏要注意的是JavaScript中的函數也是一個對象,使用typeof檢查一個函數對象時,會返回function。
2、函數創建
使用 函數對象 來創建一個函數(幾乎不用)
語法格式:
var 函數名 = new Function("執行語句");
示例代碼:
var fun = new Function("console.log('這是我的第一個函數');");
使用 函數聲明 來創建一個函數(比較常用)
語法格式:
function 函數名([形參1,形參2,...,形參N]) {
語句...
}
示例代碼:
function fun(){
console.log("這是我的第二個函數");
}
使用 函數表達式 來創建一個函數(比較常用)
語法格式:
var 函數名 = function([形參1,形參2,...,形參N]) {
語句....
}
示例代碼:
var fun = function() {
console.log("這是我的第三個函數");
}
3、函數調用
對於無參函數調用:
// 函數聲明
var fun = function () {
console.log("哈哈,我執行啦!");
}
// 函數調用
fun();
對於有參函數調用:
// 函數聲明
var sum = function (num1, num2) {
var result = num1 + num2;
console.log("num1 + num2 = " + result);
}
// 函數調用
sum(10, 20);
4、函數參數
JS中的所有的參數傳遞都是按值傳遞的,也就是説把函數外部的值賦值給函數內部的參數,就和把值從一個變量賦值給另一個變量是一樣的,在調用函數時,可以在()中指定實參(實際參數),實參將會賦值給函數中對應的形參
調用函數時,解析器不會檢查實參的類型,所以要注意,是否有可能會接收到非法的參數,如果有可能,則需要對參數進行類型的檢查,函數的實參可以是任意的數據類型
調用函數時,解析器也不會檢查實參的數量,多餘實參不會被賦值,如果實參的數量少於形參的數量,則沒有對應實參的形參將是undefined
5、函數返回值
可以使用 return 來設置函數的返回值,return後的值將會作為函數的執行結果返回,可以定義一個變量,來接收該結果。
注意:在函數中return後的語句都不會執行,如果return語句後不跟任何值就相當於返回一個undefined,如果函數中不寫return,則也會返回undefined,return後可以跟任意類型的值
語法格式:return 值
案例演示:
function sum(num1, num2) {
return num1 + num2;
}
var result = sum(10, 20);
console.log(result);
6、嵌套函數
嵌套函數:在函數中聲明的函數就是嵌套函數,嵌套函數只能在當前函數中可以訪問,在當前函數外無法訪問。
案例演示:
function fu() {
function zi() {
console.log("我是兒子")
}
zi();
}
fu();
7、匿名函數
匿名函數:沒有名字的函數就是匿名函數,它可以讓一個變量來接收,也就是用 “函數表達式” 方式創建和接收。
案例演示:
var fun = function () {
alert("我是一個匿名函數");
}
fun();
8、立即執行函數
立即執行函數:函數定義完,立即被調用,這種函數叫做立即執行函數,立即執行函數往往只會執行一次。
案例演示:
(function () {
alert("我是一個匿名函數");
})();
9、對象中的函數
對象的屬性值可以是任何的數據類型,也可以是個函數。
如果一個函數作為一個對象的屬性保存,那麼我們稱這個函數是這個對象的方法,調用這個函數就説調用對象的方法(method)。
注意:方法和函數只是名稱上的區別,沒有其它別的區別
案例演示:
var person = {
name: "zhangsan",
age: 18,
sayHello: function () {
console.log(name + " hello")
}
}
person.sayHello();
10、this對象
解析器在調用函數每次都會向函數內部傳遞進一個隱含的參數,這個隱含的參數就是this,this指向的是一個對象,這個對象我們稱為函數執行的上下文對象,根據函數的調用方式的不同,this會指向不同的對象
以函數的形式調用時,this永遠都是window
以方法的形式調用時,this就是調用方法的那個對象
案例演示:
//創建一個全局變量name
var name = "全局變量name";
//創建一個函數
function fun() {
console.log(this.name);
}
//創建一個對象
var obj = {
name: "孫悟空",
sayName: fun
};
//我們希望調用obj.sayName()時可以輸出obj的名字而不是全局變量name的名字
obj.sayName();