天天看點

TypeScript 函數

函數是一組一起執行一個任務的語句。

您可以把代碼劃分到不同的函數中。如何劃分代碼到不同的函數中是由您來決定的,但在邏輯上,劃分通常是根據每個函數執行一個特定的任務來進行的。

函數聲明告訴編譯器函數的名稱、傳回類型和參數。函數定義提供了函數的實際主體。

函數就是包裹在花括号中的代碼塊,前面使用了關鍵詞 function:

文法格式如下所示:

function () {

// 函數定義

console.log("調用函數")

}

函數隻有通過調用才可以執行函數内的代碼。

function test() { // 函數定義

test() // 調用函數

有時,我們會希望函數将執行的結果傳回到調用它的地方。

通過使用 return 語句就可以實作。

在使用 return 語句時,函數會停止執行,并傳回指定的值。

return_type 是傳回值的類型。

return 關鍵詞後跟着要傳回的結果。

一般情況下,一個函數隻有一個 return 語句。

傳回值的類型需要與函數定義的傳回類型(return_type)一緻。

function greet():string { // 傳回一個字元串

return "Hello World"

function caller() {

var msg = greet() // 調用 greet() 函數

console.log(msg)

// 調用函數

caller()

執行個體中定義了函數 greet(),傳回值的類型為 string。

greet() 函數通過 return 語句傳回給調用它的地方,即變量 msg,之後輸出該傳回值。。

編譯以上代碼,得到以下 JavaScript 代碼:

function greet() {

return "Hello World";

var msg = greet(); // 調用 greet() 函數

console.log(msg);

caller();

在調用函數時,您可以向其傳遞值,這些值被稱為參數。

這些參數可以在函數中使用。

您可以向函數發送多個參數,每個參數使用逗号 , 分隔:

param1、param2 為參數名。

datatype 為參數類型。

function add(x: number, y: number): number {

return x + y;

console.log(add(1,2))

執行個體中定義了函數 add(),傳回值的類型為 number。

add() 函數中定義了兩個 number 類型的參數,函數内将兩個參數相加并傳回。

function add(x, y) {

console.log(add(1, 2));

輸出結果為:

在 TypeScript 函數裡,如果我們定義了參數,則我們必須傳入這些參數,除非将這些參數設定為可選,可選參數使用問号辨別 ?。

執行個體

function buildName(firstName: string, lastName: string) {

return firstName + " " + lastName;

let result1 = buildName("Bob"); // 錯誤,缺少參數

let result2 = buildName("Bob", "Adams", "Sr."); // 錯誤,參數太多了

let result3 = buildName("Bob", "Adams"); // 正确

以下執行個體,我們将 lastName 設定為可選參數:

function buildName(firstName: string, lastName?: string) {

if (lastName)

else

return firstName;

let result1 = buildName("Bob"); // 正确

let result3 = buildName("Bob", "Adams"); // 正确

可選參數必須跟在必需參數後面。 如果上例我們想讓 firstName 是可選的,lastName 必選,那麼就要調整它們的位置,把 firstName 放在後面。

如果都是可選參數就沒關系。

我們也可以設定參數的預設值,這樣在調用函數的時候,如果不傳入該參數的值,則使用預設參數,文法格式為:

注意:參數不能同時設定為可選和預設。

以下執行個體函數的參數 rate 設定了預設值為 0.50,調用該函數時如果未傳入參數則使用該預設值:

function calculate_discount(price:number,rate:number = 0.50) {

var discount = price * rate;

console.log("計算結果: ",discount);

calculate_discount(1000)

calculate_discount(1000,0.30)

function calculate_discount(price, rate) {

if (rate === void 0) { rate = 0.50; }

console.log("計算結果: ", discount);

calculate_discount(1000);

calculate_discount(1000, 0.30);

有一種情況,我們不知道要向函數傳入多少個參數,這時候我們就可以使用剩餘參數來定義。

剩餘參數文法允許我們将一個不确定數量的參數作為一個數組傳入。

function buildName(firstName: string, ...restOfName: string[]) {

return firstName + " " + restOfName.join(" ");

let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");

函數的最後一個命名參數 restOfName 以 ... 為字首,它将成為一個由剩餘參數組成的數組,索引值從0(包括)到 restOfName.length(不包括)。

function addNumbers(...nums:number[]) {

var i;

var sum:number = 0;

for(i = 0;i<nums.length;i++) {

sum = sum + nums[i];

console.log("和為:",sum)

addNumbers(1,2,3)

addNumbers(10,10,10,10,10)

function addNumbers() {

var nums = [];

for (var _i = 0; _i < arguments.length; _i++) {

nums[_i] = arguments[_i];

var sum = 0;

for (i = 0; i < nums.length; i++) {

console.log("和為:", sum);

addNumbers(1, 2, 3);

addNumbers(10, 10, 10, 10, 10);

匿名函數是一個沒有函數名的函數。

匿名函數在程式運作時動态聲明,除了沒有函數名外,其他的與标準函數一樣。

我們可以将匿名函數指派給一個變量,這種表達式就成為函數表達式。

文法格式如下:

不帶參數匿名函數:

var msg = function() {

return "hello world";

console.log(msg())

var msg = function () {

};

console.log(msg());

帶參數匿名函數:

var res = function(a:number,b:number) {

return a*b;

console.log(res(12,2))

var res = function (a, b) {

return a * b;

console.log(res(12, 2));

匿名函數自調用在函數後使用 () 即可:

(function () {

var x = "Hello!!";

console.log(x)

})()

TypeScript 也支援使用 JavaScript 内置的構造函數 Function() 來定義函數:

參數說明:

arg1, arg2, ... argN:參數清單。

functionBody:一個含有包括函數定義的 JavaScript 語句的字元串。

var myFunction = new Function("a", "b", "return a * b");

var x = myFunction(4, 3);

console.log(x);

遞歸函數即在函數内調用函數本身。

舉個例子: 從前有座山,山裡有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?"從前有座山,山裡有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?'從前有座山,山裡有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?……'"

function factorial(number) {

if (number <= 0) { // 停止執行

return 1;

} else {

return (number * factorial(number - 1)); // 調用自身

console.log(factorial(6)); // 輸出 720

if (number <= 0) { // 停止執行

else {

return (number * factorial(number - 1)); // 調用自身

;

console.log(factorial(6)); // 輸出 720

Lambda 函數也稱之為箭頭函數。

箭頭函數表達式的文法比函數表達式更短。

函數隻有一行語句:

以下執行個體聲明了 lambda 表達式函數,函數傳回兩個數的和:

var foo = (x:number)=>10 + x

console.log(foo(100)) //輸出結果為 110

var foo = function (x) { return 10 + x; };

console.log(foo(100)); //輸出結果為 110

函數是一個語句塊:

var foo = (x:number)=> {

x = 10 + x

foo(100)

var foo = function (x) {

x = 10 + x;

foo(100);

我們可以不指定函數的參數類型,通過函數内來推斷參數類型:

var func = (x)=> {

if(typeof x=="number") {

console.log(x+" 是一個數字")

} else if(typeof x=="string") {

console.log(x+" 是一個字元串")

func(12)

func("Tom")

var func = function (x) {

if (typeof x == "number") {

console.log(x + " 是一個數字");

else if (typeof x == "string") {

console.log(x + " 是一個字元串");

func(12);

func("Tom");

單個參數 () 是可選的:

var display = x => {

console.log("輸出為 "+x)

display(12)

var display = function (x) {

console.log("輸出為 " + x);

display(12);

無參數時可以設定空括号:

var disp =()=> {

console.log("Function invoked");

disp();

var disp = function () {

console.log("調用函數");

重載是方法名字相同,而參數不同,傳回類型可以相同也可以不同。

每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型清單。

參數類型不同:

參數數量不同:

參數類型順序不同:

如果參數類型不同,則參數類型應設定為 any。

參數數量不同你可以将不同的參數設定為可選。

以下執行個體定義了參數類型與參數數量不同:

function disp(s1:string):void;

function disp(n1:number,s1:string):void;

function disp(x:any,y?:any):void {

console.log(y);

disp("abc")

disp(1,"xyz");

function disp(x, y) {

disp("abc");

disp(1, "xyz");