 JavaScript极速入门 —— 内核与引擎—— 内核与引擎 主讲人与课程设计:耕耕 浏览器内核 主流浏览器内核 JavaScript 引擎 主流浏览器JavaScript 引擎 浏览器内核与JavaScript 引擎关系 最初内核的概念包括渲染引擎与JS引擎,目前习惯直接称渲染引擎为内核,JS引擎独立。 浏览器内核 渲染引擎 JavaScript引擎 最初状态 浏览器内核 渲染引擎 JavaScript引擎 目前状态 JavaScript引擎独立了 渲染引擎与JavaScript 引擎 渲染引擎:Rendering Engine,一般习惯将之称为“浏览器内核”,主要功能是解析HTML/CSS进 行渲染页面,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。 JavaScript 引擎:专门处理JavaScript脚本的虚拟机、解释器,用来解释执行js代码。在早期内 核也是包含js引擎的,而现在js引擎越来独立了,可以把它单独提出来。 了,可以把它单独提出来。 总结:渲染引擎(浏览器内核)处理html/css,JavaScript引擎处理JavaScript代码,有js引擎的 地方就能解析js代码 浏览器 渲染引擎(内核) 解析html/css JavaScript引擎 解析JavaScript代码 JavaScript和java什么关系 JavaScript 在刚诞生的时候,它的名字叫 “LiveScript”。但是因为当时0 码力 | 8 页 | 394.47 KB | 1 年前3 JavaScript极速入门 —— 内核与引擎—— 内核与引擎 主讲人与课程设计:耕耕 浏览器内核 主流浏览器内核 JavaScript 引擎 主流浏览器JavaScript 引擎 浏览器内核与JavaScript 引擎关系 最初内核的概念包括渲染引擎与JS引擎,目前习惯直接称渲染引擎为内核,JS引擎独立。 浏览器内核 渲染引擎 JavaScript引擎 最初状态 浏览器内核 渲染引擎 JavaScript引擎 目前状态 JavaScript引擎独立了 渲染引擎与JavaScript 引擎 渲染引擎:Rendering Engine,一般习惯将之称为“浏览器内核”,主要功能是解析HTML/CSS进 行渲染页面,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。 JavaScript 引擎:专门处理JavaScript脚本的虚拟机、解释器,用来解释执行js代码。在早期内 核也是包含js引擎的,而现在js引擎越来独立了,可以把它单独提出来。 了,可以把它单独提出来。 总结:渲染引擎(浏览器内核)处理html/css,JavaScript引擎处理JavaScript代码,有js引擎的 地方就能解析js代码 浏览器 渲染引擎(内核) 解析html/css JavaScript引擎 解析JavaScript代码 JavaScript和java什么关系 JavaScript 在刚诞生的时候,它的名字叫 “LiveScript”。但是因为当时0 码力 | 8 页 | 394.47 KB | 1 年前3
 阮一峰 JavaScript 教程语言本身,虽然是一种解释型语言,但是在现代浏览器 中,JavaScript 都是编译后运行。程序会被高度优化,运行效率接 近二进制程序。而且,JavaScript 引擎正在快速发展,性能将越来 越好。 此外,还有一种 WebAssembly 格式,它是 JavaScript 引擎的中 间码格式,全部都是二进制代码。由于跳过了编译步骤,可以达到接近 强大的性能 导论 - 15 - 本文档使用 书栈(BookStack 可以承受很大的访问量。 JavaScript 是一种开放的语言。它的标准 ECMA-262 是 ISO 国 际标准,写得非常详尽明确;该标准的主要实现(比如 V8 和 SpiderMonkey 引擎)都是开放的,而且质量很高。这保证了这门语 言不属于任何公司或个人,不存在版权和专利的问题。 语言标准由 TC39 委员会负责制定,该委员会的运作是透明的,所有 讨论都是开放的,会议记录都会对外公布。 24 - 本文档使用 书栈(BookStack.CN) 构建 发出 HTTP 请求,为后来大行其道的 Ajax 应用创造了条件。 2000年,KDE 项目重写了浏览器引擎 KHTML,为后来的 WebKit 和 Blink 引擎打下基础。这一年的10月23日,KDE 2.0发布,第一次将 KHTML 浏览器包括其中。 2001年,微软公司时隔5年之后,发布了 IE 浏览器的下一个版本 Internet0 码力 | 540 页 | 3.32 MB | 10 月前3 阮一峰 JavaScript 教程语言本身,虽然是一种解释型语言,但是在现代浏览器 中,JavaScript 都是编译后运行。程序会被高度优化,运行效率接 近二进制程序。而且,JavaScript 引擎正在快速发展,性能将越来 越好。 此外,还有一种 WebAssembly 格式,它是 JavaScript 引擎的中 间码格式,全部都是二进制代码。由于跳过了编译步骤,可以达到接近 强大的性能 导论 - 15 - 本文档使用 书栈(BookStack 可以承受很大的访问量。 JavaScript 是一种开放的语言。它的标准 ECMA-262 是 ISO 国 际标准,写得非常详尽明确;该标准的主要实现(比如 V8 和 SpiderMonkey 引擎)都是开放的,而且质量很高。这保证了这门语 言不属于任何公司或个人,不存在版权和专利的问题。 语言标准由 TC39 委员会负责制定,该委员会的运作是透明的,所有 讨论都是开放的,会议记录都会对外公布。 24 - 本文档使用 书栈(BookStack.CN) 构建 发出 HTTP 请求,为后来大行其道的 Ajax 应用创造了条件。 2000年,KDE 项目重写了浏览器引擎 KHTML,为后来的 WebKit 和 Blink 引擎打下基础。这一年的10月23日,KDE 2.0发布,第一次将 KHTML 浏览器包括其中。 2001年,微软公司时隔5年之后,发布了 IE 浏览器的下一个版本 Internet0 码力 | 540 页 | 3.32 MB | 10 月前3
 JavaScript 正则表达式迷你书 老姚 - v1.11. 第一章 正则表达式字符匹配攻略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1. 两种模糊匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.1. 横向模糊匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.2. 纵向模糊匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2. 字符组 . . . . . . . . . . . . . . . . . . . . . . 3.1. 简写形式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3.2. 贪婪匹配与惰性匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4. 多选分支 . . . . . . . . . .0 码力 | 89 页 | 3.42 MB | 11 月前3 JavaScript 正则表达式迷你书 老姚 - v1.11. 第一章 正则表达式字符匹配攻略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1. 两种模糊匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.1. 横向模糊匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.2. 纵向模糊匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2. 字符组 . . . . . . . . . . . . . . . . . . . . . . 3.1. 简写形式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3.2. 贪婪匹配与惰性匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4. 多选分支 . . . . . . . . . .0 码力 | 89 页 | 3.42 MB | 11 月前3
 JavaScript 正则表达式迷你书 老姚 - v1.01. 第一章 正则表达式字符匹配攻略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1. 两种模糊匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.1. 横向模糊匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.2. 纵向模糊匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2. 字符组 . . . . . . . . . . . . . . . . . . . . . . 3.1. 简写形式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3.2. 贪婪匹配与惰性匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4. 多选分支 . . . . . . . . . .0 码力 | 89 页 | 3.42 MB | 11 月前3 JavaScript 正则表达式迷你书 老姚 - v1.01. 第一章 正则表达式字符匹配攻略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1. 两种模糊匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.1. 横向模糊匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.2. 纵向模糊匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2. 字符组 . . . . . . . . . . . . . . . . . . . . . . 3.1. 简写形式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3.2. 贪婪匹配与惰性匹配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4. 多选分支 . . . . . . . . . .0 码力 | 89 页 | 3.42 MB | 11 月前3
 廖雪峰JavaScript教程,每个语句以 ; 结束,语句块用 {…} 。但是,JavaScript 并不强制要求在每个语句的结尾加 ; ,浏览器中负责执行JavaScript代码的引擎会自动在每个语句 的结尾补上 ; 。 注意:让JavaScript引擎自动加分号在某些情况下会改变程序的语义,导致运行结果与期望不一致。 在本教程中,我们不会省略 ; ,所有语句都会添加 ; 。 例如,下面的一行代码就是一个完整的赋值语句: 会大大增加看懂代码的难度。遇到这种 情况,需要把部分代码抽出来,作为函数来调用,这样可以减少代码的复杂度。 以 // 开头直到行末的字符被视为行注释,注释是给开发人员看到,JavaScript引擎会自动忽略: 1. // 这是一行注释 2. alert('hello'); // 这也是注释 另一种块注释是用 /…/ 把多行字符包裹起来,把一大“块”视为一个注释: 1. /* 从这里开始是块注释 a的值是整数123 2. a = 'ABC'; // a变为字符串 这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须 指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下: 1. int a = 123; // a是整数类型变量,类型用int申明 2. a = "ABC"; // 错误:不能把字符串赋给整型变量 变量0 码力 | 264 页 | 2.81 MB | 10 月前3 廖雪峰JavaScript教程,每个语句以 ; 结束,语句块用 {…} 。但是,JavaScript 并不强制要求在每个语句的结尾加 ; ,浏览器中负责执行JavaScript代码的引擎会自动在每个语句 的结尾补上 ; 。 注意:让JavaScript引擎自动加分号在某些情况下会改变程序的语义,导致运行结果与期望不一致。 在本教程中,我们不会省略 ; ,所有语句都会添加 ; 。 例如,下面的一行代码就是一个完整的赋值语句: 会大大增加看懂代码的难度。遇到这种 情况,需要把部分代码抽出来,作为函数来调用,这样可以减少代码的复杂度。 以 // 开头直到行末的字符被视为行注释,注释是给开发人员看到,JavaScript引擎会自动忽略: 1. // 这是一行注释 2. alert('hello'); // 这也是注释 另一种块注释是用 /…/ 把多行字符包裹起来,把一大“块”视为一个注释: 1. /* 从这里开始是块注释 a的值是整数123 2. a = 'ABC'; // a变为字符串 这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须 指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下: 1. int a = 123; // a是整数类型变量,类型用int申明 2. a = "ABC"; // 错误:不能把字符串赋给整型变量 变量0 码力 | 264 页 | 2.81 MB | 10 月前3
 阮一峰 《ECMAScript 6入门》 第三版i 其实都是一个新的变量,所以最后输出的是 6 。你可能会问,如果每一 轮循环的变量 i 都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本 轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的 变量 i 时,就在上一轮循环的基础上进行计算。 另外, for 循环还有一个特别之处,就是设置循环变量的那部分是一个父作用 域,而循环体内部是一个单独的子作用域。 let c = 3; ES6 允许写成下面这样。 let [a, b, c] = [1, 2, 3]; 上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。 本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被 赋予对应的值。下面是一些使用嵌套数组进行解构的例子。 变量的解构赋值 45 let [foo, [[bar], baz]] = [1, [[2] [foo] = []; let [bar, foo] = [1]; 以上两种情况都属于解构不成功, foo 的值都会等于 undefined 。 另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。 这种情况下,解构依然可以成功。 变量的解构赋值 46 let [x, y] = [1, 2, 3]; x // 1 y // 2 let [a, [b], d]0 码力 | 679 页 | 2.66 MB | 1 年前3 阮一峰 《ECMAScript 6入门》 第三版i 其实都是一个新的变量,所以最后输出的是 6 。你可能会问,如果每一 轮循环的变量 i 都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本 轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的 变量 i 时,就在上一轮循环的基础上进行计算。 另外, for 循环还有一个特别之处,就是设置循环变量的那部分是一个父作用 域,而循环体内部是一个单独的子作用域。 let c = 3; ES6 允许写成下面这样。 let [a, b, c] = [1, 2, 3]; 上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。 本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被 赋予对应的值。下面是一些使用嵌套数组进行解构的例子。 变量的解构赋值 45 let [foo, [[bar], baz]] = [1, [[2] [foo] = []; let [bar, foo] = [1]; 以上两种情况都属于解构不成功, foo 的值都会等于 undefined 。 另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。 这种情况下,解构依然可以成功。 变量的解构赋值 46 let [x, y] = [1, 2, 3]; x // 1 y // 2 let [a, [b], d]0 码力 | 679 页 | 2.66 MB | 1 年前3
 2019-2021 美团技术年货 前端篇在适配开始之前,我们要明确好先做哪些事情。先来回顾一下 Flutter 的三层结构: 在 Flutter 的架构设计中,最上层为框架层,使用 Dart 语言开发,面向 Flutter 业务 的开发者;中间层为引擎层,使用 C/C++ 开发,实现了 Flutter 的渲染管线和 Dart 运行时等基础能力;最下层为嵌入层,负责与平台相关的能力实现。显然我们要做的 是将嵌入层移植到鸿蒙上,确切地说,我们要通过鸿蒙原生提供的平台能力,重新实 将图像上屏。这个流程 的大部分工作都由框架层和引擎层完成,对于鸿蒙的适配,我们主要关注的是与设备 自身能力相关的问题,即: 4 > 2021年美团技术年货 (1) 如何监听设备的 VSync 信号并通知 Flutter 引擎? (2) OpenGL/Vulkan 用于上 屏的窗口对象从何而来? VSync 信号的监听及传递 在 Flutter 引擎的 Android 实现中,设备的 VSync VsyncWaiter 类调用 Android SDK 的 Choreographer.postFrameCallback 方 法, 再 通 过 JNI 一 层 层 传 回 Flutter 引擎消费掉此回调。Java 侧的 VsyncWaiter 核心代码如下: @Override public void asyncWaitForVsync(long cookie) { Choreographer0 码力 | 738 页 | 50.29 MB | 1 年前3 2019-2021 美团技术年货 前端篇在适配开始之前,我们要明确好先做哪些事情。先来回顾一下 Flutter 的三层结构: 在 Flutter 的架构设计中,最上层为框架层,使用 Dart 语言开发,面向 Flutter 业务 的开发者;中间层为引擎层,使用 C/C++ 开发,实现了 Flutter 的渲染管线和 Dart 运行时等基础能力;最下层为嵌入层,负责与平台相关的能力实现。显然我们要做的 是将嵌入层移植到鸿蒙上,确切地说,我们要通过鸿蒙原生提供的平台能力,重新实 将图像上屏。这个流程 的大部分工作都由框架层和引擎层完成,对于鸿蒙的适配,我们主要关注的是与设备 自身能力相关的问题,即: 4 > 2021年美团技术年货 (1) 如何监听设备的 VSync 信号并通知 Flutter 引擎? (2) OpenGL/Vulkan 用于上 屏的窗口对象从何而来? VSync 信号的监听及传递 在 Flutter 引擎的 Android 实现中,设备的 VSync VsyncWaiter 类调用 Android SDK 的 Choreographer.postFrameCallback 方 法, 再 通 过 JNI 一 层 层 传 回 Flutter 引擎消费掉此回调。Java 侧的 VsyncWaiter 核心代码如下: @Override public void asyncWaitForVsync(long cookie) { Choreographer0 码力 | 738 页 | 50.29 MB | 1 年前3
 electron中文教程
nt任务可以自动的处理这些内容 grunt- build-atom-shell. 这个任务会自动的处理编辑 .gyp 文件,从源代码进行编译,然后重编译你的应用程序的本地 Node 模块以匹配 这个新的可执行文件的名称。 分发应用 - 9 - 本文档使用 书栈(BookStack.CN) 构建 自从 v0.34.0,Electron 就允许提交应用包到 Mac App Store(MAS)。这个向导提供的信息有: 本文档使用 书栈(BookStack.CN) 构建 Electron 同样也支持原生模块,但由于和官方的 Node 相比使用了不同的 V8 引擎,如果你想编译原生模块,则 需要手动设置 Electron 的 headers 的位置。 当 Node 开始换新的V8引擎版本时,原生模块可能“坏”掉。为确保一切工作正常,你需要检查你想要使用的原生模 块是否被 Electron 内置的 Node 支持。你可以在这里查看 Electron 提供了 —debug 和 —debug-brk 开关。 使用如下的命令行开关来调试 Electron 的主进程: 当这个开关用于 Electron 时,它将会监听 V8 引擎中有关 port 的调试器协议信息。默认的 port 是 5858 。 就像 —debug 一样,但是会在第一行暂停脚本运行。 备注: Electron 目前对 node-inspector0 码力 | 203 页 | 2.72 MB | 1 年前3 electron中文教程
nt任务可以自动的处理这些内容 grunt- build-atom-shell. 这个任务会自动的处理编辑 .gyp 文件,从源代码进行编译,然后重编译你的应用程序的本地 Node 模块以匹配 这个新的可执行文件的名称。 分发应用 - 9 - 本文档使用 书栈(BookStack.CN) 构建 自从 v0.34.0,Electron 就允许提交应用包到 Mac App Store(MAS)。这个向导提供的信息有: 本文档使用 书栈(BookStack.CN) 构建 Electron 同样也支持原生模块,但由于和官方的 Node 相比使用了不同的 V8 引擎,如果你想编译原生模块,则 需要手动设置 Electron 的 headers 的位置。 当 Node 开始换新的V8引擎版本时,原生模块可能“坏”掉。为确保一切工作正常,你需要检查你想要使用的原生模 块是否被 Electron 内置的 Node 支持。你可以在这里查看 Electron 提供了 —debug 和 —debug-brk 开关。 使用如下的命令行开关来调试 Electron 的主进程: 当这个开关用于 Electron 时,它将会监听 V8 引擎中有关 port 的调试器协议信息。默认的 port 是 5858 。 就像 —debug 一样,但是会在第一行暂停脚本运行。 备注: Electron 目前对 node-inspector0 码力 | 203 页 | 2.72 MB | 1 年前3
 TypeScript Handbook(中文版)
console.log("."); } console.log("World!"); } dramaticWelcome(); 编译和运行输出应该会在ES3/ES5引擎上产生正确的行为。 支持外部辅助库( tslib ) TypeScript注入了一些辅助函数,如继承 _extends 、JSX中的展开运算 符 __assign 和异步函数 __awaiter "node_modules", "**/*.spec.ts" ] } 支持文件通配符的符号有: * 匹配零个或多个字符(不包括目录) ? 匹配任意一个字符(不包括目录) **/ 递归匹配所有子目录 如果文件通配符模式语句中只包含 * 或 .* ,那么只匹配带有扩展名的文件(例 如默认是 .ts 、 .tsx 和 .d.ts ,如果 allowJs 设置 为 way around. declare module "json!*" { const value: any; export default value; } 现在你可以导入匹配 "*!text" 或 "json!*" 的东西了。 import fileContent from "./xyz.txt!text"; import data from "json!http://example0 码力 | 557 页 | 7.48 MB | 1 年前3 TypeScript Handbook(中文版)
console.log("."); } console.log("World!"); } dramaticWelcome(); 编译和运行输出应该会在ES3/ES5引擎上产生正确的行为。 支持外部辅助库( tslib ) TypeScript注入了一些辅助函数,如继承 _extends 、JSX中的展开运算 符 __assign 和异步函数 __awaiter "node_modules", "**/*.spec.ts" ] } 支持文件通配符的符号有: * 匹配零个或多个字符(不包括目录) ? 匹配任意一个字符(不包括目录) **/ 递归匹配所有子目录 如果文件通配符模式语句中只包含 * 或 .* ,那么只匹配带有扩展名的文件(例 如默认是 .ts 、 .tsx 和 .d.ts ,如果 allowJs 设置 为 way around. declare module "json!*" { const value: any; export default value; } 现在你可以导入匹配 "*!text" 或 "json!*" 的东西了。 import fileContent from "./xyz.txt!text"; import data from "json!http://example0 码力 | 557 页 | 7.48 MB | 1 年前3
 TypeScript 4.0 使用手册
有一个参数,并要求这个对象参数有一个 名为 label 类型为 string 的属性。 需要注意的是,我们传入的对象参数实际上会包含很多属 性,但是编译器只会检查那些必需的属性是否存在,并且其类型是否匹配。 然而,有些时候 TypeScript 却并不会这么宽松,我们下面会稍做讲解。 下面我们重写上面的例子,这次使用接口来描述:必须包含一个 label 属性且类型为 string : 1. result = source.search(subString); 4. return result > -1; 5. }; 对于函数类型的类型检查来说,函数的参数名不需要与接口里定义的名字相匹配。 比如,我们使用下 面的代码重写上面的例子: 1. let mySearch: SearchFunc; 2. mySearch = function(src: string, sub: string): search(sub); 4. return result > -1; 5. }; 如果让这个函数返回数字或字符串,类型检查器会警告我们函数的返回值类型与 SearchFunc 接口中 的定义不匹配。 1. let mySearch: SearchFunc; 2. 3. // error: Type '(src: string, sub: string) => string' is0 码力 | 683 页 | 6.27 MB | 1 年前3 TypeScript 4.0 使用手册
有一个参数,并要求这个对象参数有一个 名为 label 类型为 string 的属性。 需要注意的是,我们传入的对象参数实际上会包含很多属 性,但是编译器只会检查那些必需的属性是否存在,并且其类型是否匹配。 然而,有些时候 TypeScript 却并不会这么宽松,我们下面会稍做讲解。 下面我们重写上面的例子,这次使用接口来描述:必须包含一个 label 属性且类型为 string : 1. result = source.search(subString); 4. return result > -1; 5. }; 对于函数类型的类型检查来说,函数的参数名不需要与接口里定义的名字相匹配。 比如,我们使用下 面的代码重写上面的例子: 1. let mySearch: SearchFunc; 2. mySearch = function(src: string, sub: string): search(sub); 4. return result > -1; 5. }; 如果让这个函数返回数字或字符串,类型检查器会警告我们函数的返回值类型与 SearchFunc 接口中 的定义不匹配。 1. let mySearch: SearchFunc; 2. 3. // error: Type '(src: string, sub: string) => string' is0 码力 | 683 页 | 6.27 MB | 1 年前3
共 44 条
- 1
- 2
- 3
- 4
- 5













