| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> JavaScript语言精粹学习笔记之函数(二) -> 正文阅读 |
|
[JavaScript知识库]JavaScript语言精粹学习笔记之函数(二) |
九、作用域 ? ? ? ? 作用域控制着变量与参数的可见性及生命周期。对我们来说是一个重要的帮助,因为它减少了名称冲突,并且提供了自身内存管理。
JS中,定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都可见。 十、闭包 ????????
这个 quo 函数被设计成无须在前面加上 new 来使用,所以它名字也没有首字母大写。当我们调用 quo 时,它返回包含 get_status 方法的一个新对象。该对象的一个引用保存在myQuo中。即使 quo 已经返回了,但 get_status 方法仍然享有访问 quo 对象的 status 属性的特权。get_status 方法并不是访问该参数的一个拷贝,它访问的就是该参数本身。因为该函数可以访问它被创建时所处的上下文环境。这被称为闭包。 十一、回调 ? ? ? ? 函数可以让不连续事件处理变得更容易。
这种方式的问题在于网络上的同步请求将会导致客户端进入假死状态。如果网络传输或服务器很慢,响应性的降低将是不可接受的。 我们有一个更好的方法:发起异步请求,提供一个当服务器的响应达到将被调用的回调函数。异步的函数立即返回,这样客户端就不会被阻塞。
我们传递了一个函数作为参数给 send_request_asynchronously 函数,它将在收到响应时被调用。 十二、模块 ? ? ? ? 模块是一个提供接口却影藏状态与实现的函数或对象。 ? ? ? ? 我们可以使用函数和闭包来构造模块。 ? ? ? ? 模块模式利用了函数作用域和闭包来创建绑定对象与私有成员的关联。 ? ? ? ? 模块模式:一个定义了私有变量和函数的函数,利用闭包创建可以访问私有变量和函数的特权函数,最后返回这个特权函数,或者把它们保存到一个可访问的地方。 模块模式也可以用来产生安全的对象:
seqer 包含的方法都没有用到 this 或 that。?因此没有办法损害 seqer 。除非调用对应的方法,否则没法改变 prefix 或 seq 的值。 seqer 对象是可变的,所以它的方法可能会被替换掉,但替换后的方法依然不能访问私有成员。seqer 就是一组函数的集合,而且那些函数被授予特权,拥有使用或修改私有状态的能力。 如果把 seqer.gensym 作为一个值传递给第三方函数,那个函数能用它产生唯一字符串,但是不能通过它来改变 prefix 或 seq 的值。 十三、级联 ? ? ? ? 有些方法没有返回值。如果我们让这些方法返回 this 而不是 undefined, 就可以启用级联。 ? ? ? ? 在一个级联中我们可以在单独一条语句中依次调用同一个对象的很多方法。 ????????一个启用级联的Ajax 类库可能允许我们以这样的形式去编码:
这里,getElement 函数产生一个对应于 id="myBoxDiv" 的DOM元素并提供了其他功能的对象。该方法允许我们移动元素,修改它的尺寸和样式,并添加行为。这些方法每一个都返回该对象,所以调用返回的结果可以被下一次调用所用。 级联可以产生出具备很强表现力的接口,它也能帮助控制那种构造试图一次做太多事情的接口的趋势。 十四、套用 ? ? ? ? 函数也是值,套用 允许我们将函数与传递给它的参数相结合去产生出一个新的函数。 ????????
JS并没有 curry 方法,但我们可以通过给 Function.prototype 添加功能来实现:
curry 使用Array 的concat 方法去连接两个参数数组。 这样做会有问题,arguments 数组并非一个真正的数组,所以它并没有 concat 方法。 要避开这个问题我们必须在两个 arguments 数组上都应用数组的 slice 方法。这样产生出拥有 concat 方法的常规数组。
十五、记忆 ? ? ? ? ? 函数可以用对象先记住先前操作的结果,从而能避免无谓的运算,这种优化被称为记忆。 ? ? ? ? JS的对象和数组要实现记忆是比较方便的:
如果我们让该函数具备记忆功能,就可以减少它的运算量。 在一个名为memo的数组里保存我们的存储结果,存储结果可以隐藏才闭包中。当我们的函数被调用时,这个函数首先看是否已经知道存储结果,如果已经知道,就立即返回这个存储结果。
这个函数的返回同样的结果 还可以使用 memoizer 来定义 fibonacci 函数,提供其初始的 memo 数组和 fundamental 函数:
还能继续优化:
要产生一个可以记忆的阶乘函数,我们只需要提供基本的阶乘公式即可。 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:14:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |