JavaScript语言精粹读书笔记 - JavaScript函数
JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言相似以外,其他几乎没有相似之处。
JavaScript 函数:
函数包含一组语句,他们是JavaScript的基础模块单元,用于代码复用、信息隐藏和组合调用。
函数用于指定对象的行为。
函数对象Functions:
在JavaScript中函数就是对象。对象是“键值”对的集合并拥有一个连接到原型对象的隐藏连接。
对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype)。
每个函数在创建时都拥有两个附加属性:函数的上下文和实现函数行为的代码。
每个函数对象在创建时也随带有一个prototype属性,它的值是一个拥有constructor属性且值即为该函数的对象。
函数字面量Function Literal:
var add = function(a, b) {return a + b;};
通过函数字面量创建的函数对象包含一个连到外部上下文的连接,这被称为闭包。
调用Invocation:
调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。除了声明时定义的形式参数,每个函数接收两个附加的属性:this和arguments。
参数this在面向对象的编程中非常重要,它的值取决于调用的模式。JavaScript中一共有4中调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。这些模式在如何初始化关键参数this上存在差异。
调用运算符():跟在任何产生一个函数值的表达式之后的一对圆括号。当实际参数(arguments)的个数与形式参数(parameters)的个数不匹配时,不会导致运行时错误。
方法调用模式:The Method Invocation Pattern
当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。如果一个调用表达式包含一个属性存取表达式(即一个.号表达式或[subscript]下标表达式),那么它被当作一个方法来调用。
方法可以使用this去访问对象,所以它能从对象中取值或修改该对象。this到对象的绑定发生在调用的时候。这个“超级”迟绑定(very late binding)使得函数可以对this高度复用。通过this可取得他们所属对象的上下文的方法称为公共方法。
函数调用模式:The Function Invocation Pattern
当一个函数并非一个对象的属性时,那么它被当作一个函数来调用。
var sum = add(3,4);
当函数以此模式调用时,this被绑定到全局对象。
// 给myObject增加一个double方法(上面myObject对象已经有了属性value和方法increasement)
myObject.double = function(){
var that = this;
var helper = function() {
that.value = add(that.value, that.value);
};
// The Function Invocation Pattern
helper();
}
// The Method Invocation Pattern
myObject.double();
document.writeln(myObject.getValue());
构造器调用模式:The Constructor Invocation Pattern
JavaScript是一门基于原型继承的预言。这意味着对象可以直接从其他对象继承属性。该语言是无类别的。这偏离了当今编程的主流。当今大多数语言都是基于类的语言。尽管原型继承有着强大的表现力,但他并不被广泛理解。JavaScript本身对其原型的本质也缺乏信心,所以它提供了一套和基于类的语言类似的对象构建语法。
如果在一个函数前面带上new来调用,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将会被绑定到那个新对象上。
结合new前缀调用的函数被称为构造器函数。按照约定,他们保存在以大写格式命名的变量里。
Apply调用模式:The Apply Invocation Pattern
因为JavaScript是一门函数式的面向对象编程语言,所以函数可以拥有方法。
apply方法让我们构建一个参数数组并用其去调用函数。它也允许我们选择this的值。
apply方法接收两个参数。第一个参数将被绑定给this。第二个就是一个参数数组。
参数Arguments:
当函数被调用时,会得到一个“免费”奉送的变量arguments数组。通过它函数可以访问所有它被调用时传递给它的参数列表,包括那些没有被分配给函数声明时定义的形式参数的多余参数。这使得编写一个无须指定参数的函数成为可能。
arguments是一个类似数组(array-like)的对象,他并不是真正的数组。有length属性,但没有数组的其他方法。
返回Return:
一个函数总是会返回一个值,如果没有指定返回值,则返回undefined。
如果函数以在前面加上new前缀的方法来调用,且返回值不是一个对象,则返回this(该新对象)。
异常Exceptions:try catch throw
给类型增加方法:
JavaScript允许给语言的基本类型增加方法(通过prototype)。
Function.prototype.method = function (name, method) {if(this.prototype[name]){this.prototype[name] = method; return this;}};
通过给Function.prototype对象增加一个method方法,我们就不必键入prototype这个属性名。
Number.method('integer', function () {return Math[this < 0 ? 'ceiling' : 'floor'](this);});
String.metho('trim', function () {return this.replace('/^\s+|\s+$/g','');});
通过给基本类型增加方法,我们可以大大提高语言的表现力。因为JavaScript是原型继承的动态本质(在属性访问符调用时,一层一层检查),新的方法立刻被赋予到所有的值(对象)上,哪怕值(对象)是在方法被创建之前就创建好了。
另一个需要注意的是for in 语句在原型上时表现很糟糕。可以用hasOwnProperty方法筛选出继承而来的属性。
递归Recursion:汉诺塔难题
作用域Scope:
在编程语言中,作用域控制着变量与参数的可见性和生命周期。对程序员来说这是一个重要的帮组,因为它减少了名称冲突,并且提供了自动内存管理。
闭包Closure:
作用域的好处是内部函数可以访问定义在它们外部的参数和变量(除了this和arguments)。
回调Callbacks:
模块Module:
我们可以使用函数和闭包来构造模块。模块是一个提供接口却隐藏状态与实现的函数或对象。通过使用函数去产生模块,我们几乎可以完全摒弃全局变量的使用,从而缓解这个JavaScript的最为糟糕的特性之一所带来的影响。
模块的一般形式:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量和函数的特权函数。最后返回特权函数,或者把他们保存到一个可以访问到的地方。
级联Cascade:
有一些方法没有返回值。如果我们让这些方法返回this而不是undefined,就可以启动级联(例子:jQuery的链式调用)。
套用Curry:
记忆Memoization:
函数可以用对象去记住先前的结果,从而能避免无谓的运算。这种优化被称为记忆。
JavaScript语言精粹读书笔记 - JavaScript函数的更多相关文章
- JavaScript语言精粹读书笔记- JavaScript对象
JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collecti ...
- <JavaScript语言精粹>-读书笔记(一)
用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链. for(my in obj){ if(obj.hasOwnProperty(my) ...
- JavaScript语言精粹-读书笔记
前言:很久之前读过一遍该书,近日得闲,重拾该书,详细研究一方,欢迎讨论指正. 目录: 1.精华 2.语法 3.对象 4.函数 5.继承 6.数组 7.正则表达式 8.方法 9.代码风格 10.优美的特 ...
- JavaScript 语言精粹读书笔记
最近在看 赵泽欣 / 鄢学鹍 翻译的 蝴蝶书, 把一些读后感言记录在这里. 主要是把作者的建议跟 ES5/ES5.1/ES6 新添加的功能进行了对比 涉及到的一些定义 IIFE: Immediatel ...
- <JavaScript语言精粹>--<读书笔记三>之replace()与正则
今天有人问我repalce(),他那个题目很有意思.我也不会做,于是我就去查,结果发现就是最基础的知识的延伸. 所以啊最基础的知识才是很重要的,千万不能忽略,抓起JS就写代码完全不知到所以然,只知道写 ...
- 【Javascript语言精粹】笔记摘要
现在大部分编译语言中都流行要求强类型.其原理在于强类型允许编译器在编译时检测错误.我们能越早检测和修复错误,付出的代价越小.Javascript是一门弱类型的语言,所以Javascript编译器不能检 ...
- JavaScript语言精粹学习笔记
0.JavaScript的简单数据类型包括数字.字符创.布尔值(true/false).null和undefined值,其它值都是对象. 1.JavaScript只有一个数字类型,它在内部被表示为64 ...
- 学习javascript语言精粹的笔记
1.枚举: 用for in 语句来遍历一个对象中所有的属性名,该枚举过程将会列出所有的属性也包括涵数和方法,如果我们想过滤掉那些不想要的值,最为常用的过滤器为hasOwnProperty方法,以及使用 ...
- 《JavaScript语言精粹》笔记
0.JavaScript的简单数据类型包括数字.字符创.布尔值(true/false).null和undefined值,其它值都是对象. 1.JavaScript只有一个数字类型,它在内部被表示为64 ...
随机推荐
- canvas中的rotate的使用方法
今天在绘制一个足球滚动的时候,想使用rotate方法,之前看到这个方法的时候,并没有引起任何重视,无非就是和CSS3里的rotate一样的用么... 遗憾的是,事实并非如此,由于代码在公司,我也就不去 ...
- jQuery File Upload 单页面多实例的实现
jQuery File Upload 的 GitHub 地址:https://github.com/blueimp/jQuery-File-Upload 插件描述:jQuery File Upload ...
- [lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题
这是一个坑,天坑!如果不是我随手删除了一个本地变量,这个问题直到现在我应该也没有头绪. 首先,写了一个新的lua脚本,载入,执行.在执行的时候,出了这么一个莫名其妙的问题: EXC_BAD_ACCES ...
- IOS 绘图教程Quartz2D
http://www.cocoachina.com/industry/20140115/7703.html http://www.cnblogs.com/wendingding/p/3803020.h ...
- 带你玩转JavaWeb开发之五-如何完成响应式开发页面
响应式页面开发 使用BootStrap开发一个响应式的页面出来 响应式开发就是同一个页面在PC端与手机端Pad端显示不同的效果,以给用户更好的体验 需求分析 开发一套页面,让用户能够在PC端, Pad ...
- Raspberry pi 添加vnc远程桌面控制
// 安装服务 apt-get install tightvncserver // 设置连接密码 vncpasswd // 在端口1处开启服务 tightvncserver :1
- 对Git的理解
GIT属于计算机软件,功能是分布式版本控制系统,字面意思还挺有意思的:愚蠢或不开心的人,首先呢,这款软件是免费的.这款软件是免费的.这款软件是免费的.(重要的地方要说三遍)即使它不是免费的,在我大天朝 ...
- libgdx 裁剪多边形(clip polygon、masking polygon)
直接放例子代码,代码中以任意四边形为例,如果需要做任意多边形,注意libgdx不能直接用ShapeRender填充多边形,需要先切割成三角形. public static void drawClip( ...
- iOS 导航栏返回的相关跳转
导航条跳转页面的考虑 对于用navigationcontroller来跳转页面的时候,其实是执行堆栈的进栈和出栈的操作,要想释放内存,那么在来回跳转的时候,就要考虑几个问题了 1 A =>B=& ...
- iOS 面试题(二):什么时候在 block 中不需要使用 weakSelf --转自唐巧
问题 我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码: __weak typeof(self) weakSelf ...