1、快速回顾一下这JavaScript中的命名函数和匿名函数:

纯文本查看 复制代码
1
2
3
4
5
//Named functionfunction add(x, y) {
    return x+y;
}
 
//Anonymous functionvar myAdd = function(x, y) { return x+y; };

2、TS简单函数例子

纯文本查看 复制代码
1
2
3
4
5
function add(x: number, y: number): number {
    return x+y;
}
 
var myAdd = function(x: number, y: number): number { return x+y; };

我们可以自定义每个参数和返回类型。
3、编写匿名函数一个函数的类型有相同的两个部分:参数和返回类型的类型。  这个名字只是帮助可读性。可以不一样,只要函数类型统一即可。

纯文本查看 复制代码
1
2
var myAdd: (baseValue:number, increment:number)=>number =
    function(x: number, y: number): number { return x+y; };

我们明确的返回类型使用(= >)表示。 
4、根据上下文判断返回类型
通过返回数据判断返回类型

纯文本查看 复制代码
1
2
3
4
// myAdd has the full function typevar myAdd = function(x: number, y: number): number { return x+y; };
 
// The parameters 'x' and 'y' have the type numbervar myAdd: (baseValue:number, increment:number)=>number =
    function(x, y) { return x+y; };

5、默认参数如下写法,必须传入指定的变量,否则报错。

 纯文本查看 复制代码
1
2
3
4
5
function buildName(firstName: string, lastName: string) {
    return firstName + " " + lastName;
}
 
var result1 = buildName("Bob")//error, too few parametersvar result2 = buildName("Bob", "Adams", "Sr.")//error, too many parametersvar result3 = buildName("Bob", "Adams")//ah, just right

我们在TS中使用?表示可选参数。 例如,我们希望最后一个参数是可选的:

纯文本查看 复制代码
1
2
3
4
5
6
7
8
function buildName(firstName: string, lastName?: string) {
    if (lastName)
        return firstName + " " + lastName;
    else
        return firstName;
}
 
var result1 = buildName("Bob")//works correctly nowvar result2 = buildName("Bob", "Adams", "Sr.")//error, too many parametersvar result3 = buildName("Bob", "Adams")//ah, just right

可选参数必须遵循必需的参数。 如果我们想让名可选而不是姓,我们需要改变参数在函数的顺序,把名字列表中的最后一个。

在TS中,我们还可以设定一个值,一个可选参数如果用户不提供。 这些被称为缺省参数。 让我们前面的示例和默认的姓“Smith”。

纯文本查看 复制代码
1
2
3
4
5
function buildName(firstName: string, lastName = "Smith") {
    return firstName + " " + lastName;
}
 
var result1 = buildName("Bob")//works correctly now, alsovar result2 = buildName("Bob", "Adams", "Sr.")//error, too many parametersvar result3 = buildName("Bob", "Adams")//ah, just right

如下为缺省参数,即包含默认值。

纯文本查看 复制代码
1
function buildName(firstName: string, lastName = "Smith") {

6、rest参数

纯文本查看 复制代码
1
2
3
4
5
function buildName(firstName: string, ...restOfName: string[]) {
        return firstName + " " + restOfName.join(" ");
}
 
var employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");

使用...代表一个变量集合。 7、Lambdas和使用“this”this在js中的使用是相当混乱的。通常要根据上下文来判断其含义。

让我们来看一个例子:

纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
var deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        return function() {
            var pickedCard = Math.floor(Math.random() * 52);
            var pickedSuit = Math.floor(pickedCard / 13);
 
            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}
 
var cardPicker = deck.createCardPicker();
var pickedCard = cardPicker();
 
alert("card: " + pickedCard.card + " of " + pickedCard.suit);

这时候会报错,因为this找不到suits,因为这个时候的this已经不是deck中的this了。

<1>为了解决这个问题,我们切换函数使用lambda表达式语法(()= > { })而不是JavaScript函数表达式。 这将自动捕获创建函数时可用的“this”:

纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
var deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        // Notice: the line below is now a lambda, allowing us to capture 'this' earlier
        return () => {
            var pickedCard = Math.floor(Math.random() * 52);
            var pickedSuit = Math.floor(pickedCard / 13);
 
            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}
 
var cardPicker = deck.createCardPicker();
var pickedCard = cardPicker();
 
alert("card: " + pickedCard.card + " of " + pickedCard.suit);

<2>使用bind方法[希望我没有理解错]

纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
var deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        return function() {
            var pickedCard = Math.floor(Math.random() * 52);
            var pickedSuit = Math.floor(pickedCard / 13);
 
            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}
 
var cardPicker = deck.createCardPicker().bind(deck);var pickedCard = cardPicker();
 
alert("card: " + pickedCard.card + " of " + pickedCard.suit);

更多信息方式,你可以阅读Yahuda卡茨 理解JavaScript函数调用和“this” 。 
==================================================

TypeScript教程3的更多相关文章

  1. TypeScript教程2

    在TS中,我们允许开发人员使用面向对象技术. 1.类让我们看看一个简单的基于类的例子: class Greeter { greeting: string; constructor(message: s ...

  2. TypeScript教程

    汇智课堂 地址  http://www.hubwiz.com/course/55b724ab3ad79a1b05dcc26c/ TypeScript是一种由微软开发的自由和开源的编程语言.它是Java ...

  3. TypeScript 教程&手册

    参考:https://www.w3cschool.cn/typescript/ https://www.gitbook.com/book/zhongsp/typescript-handbook/det ...

  4. TypeScript教程1

    Boolean类型aser:和as3一样 var isDone: boolean = false; 复制代码 Number类型aser:as3经常用int和uint,以后只用number就可以啦 va ...

  5. 2018-05-09 5分钟入门CTS-尝鲜中文版TypeScript

    知乎原链 本文为中文代码示例之5分钟入门TypeScript的CTS版本. CTS作者是@htwx(github). 它实现了关键词和标准库的所有命名汉化. 本文并未使用附带的vscode相关插件(包 ...

  6. HowToDoInJava 其它教程 1 &#183; 翻译完成

    原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 Maven 教程 如何在 ...

  7. 【electron+vue3+ts实战便笺exe】一、搭建框架配置

    不要让自己的上限成为你的底线 前言 诈尸更新系列,为了跟上脚步,尝试了vue3,在学习vue3的时候顺便学习一手electron和ts,本教程将分别发布,源码会在最后的文章发布.因为还在开发中,目前也 ...

  8. 100 个常见错误「GitHub 热点速览 v.22.35」

    本周的特推非常得延续上周的特点--会玩,向别人家的女朋友发送早安.这个错误是如何发生的呢?如何有效避免呢?自己用 daily_morning 免部署.定制一个早安小助手给女友吧. 除了生活中的错误,工 ...

  9. 转载:TypeScript 简介与《TypeScript 中文入门教程》

    简介 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构 ...

随机推荐

  1. CodeForces 605B Lazy Student

    构造.对边的权值排序,权值一样的话,在MST中的边排到前面,否则权值小的排在前面. 然后边一条一条扫过去,如果是1 ,那么连一个点到集合中,如果是0,集合内的边相连. #include<cstd ...

  2. hibernate--多对多双向关联(少用)

    老师知道自己教了哪些学生, 学生也知道教自己的有哪些老师. Teacher.java: package com.bjsxt.hibernate; import java.util.HashSet; i ...

  3. Nginx架构解析

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. daemon守护线程 nginx在启动后 ...

  4. log4CXX第二篇---配置文件(properties文件)详解

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  5. storybody中页面跳转

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if ([segue.destinationViewCont ...

  6. android中广播的使用

    广播消息机制用于进行系统级别的消息通知,每个应用程序可以对感兴趣的广播进行注册,并且将接收广播的方法定义在广播接收器中(Broadcast). 广播可以分为标准广播和有序广播. 注册广播的方法可以动态 ...

  7. VR元年,VR虚拟现实这只风口上的猪有怎样的变化?

    走过了2016年,无论我们承认不承认,这一年到底是不是VR元年,我们都很难否定,在这一年,VR虚拟现实生态圈有很大的变化,那么,这一年VR虚拟现实到底有怎样的改变呢?我们的VR虚拟现实生态圈,发生了什 ...

  8. 最基本的SQL语法/语句

    DDL—数据定义语言(Create,Alter,Drop,DECLARE) DML—数据操纵语言(Select,Delete,Update,Insert) DCL—数据控制语言(GRANT,REVOK ...

  9. js排序算法汇总

    JS家的排序算法   十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...

  10. CART分类与回归树 学习笔记

    CART:Classification and regression tree,分类与回归树.(是二叉树) CART是决策树的一种,主要由特征选择,树的生成和剪枝三部分组成.它主要用来处理分类和回归问 ...