《JavaScript 言语精炼》 读书笔记
第四章 函数 Functions
函数字面量
函数字面量包括4个部份:
- 第一部份, 保留字 function
第二部份, 函数名,它能够被疏忽。没有函数名,则被称为匿名函数
优点:- 能够经由过程函数名,递归的挪用本身。
- 此名字也能够被调试器和开发工具用来辨认函数。
- 第三部份, 包围在圆括号中的一组参数。这些参数的称号将被定义为函数中的变量。它们不像一般的变量那样将被初始化为undefined,而是在函数被挪用时初始化为现实供应的参数的值。
- 第四部份, 包围在花括号中的一组语句。也是函数的主体,它们在函数被挪用时实行
经由过程函数字面量建立的函数对象包括一个衔接到外部上下文的衔接。这被称为闭包(closure),它是JavaScript壮大表现力的泉源。
挪用 Invocation
挪用一个函数会停息当前函数的实行,通报控制权和参数给新函数,除了声明时定义的情势参数,每一个函数还衔接两个附加的参数:this 和 arguments
this 的值取决于挪用的情势
在JavaScript中一共有4种挪用情势:
- 要领挪用情势
- 函数挪用情势
- 组织器挪用情势
- apply挪用情势
挪用运算符:跟在任何发生一个函数值的表达式以后的一对圆括号()。表达式内可包括零个或多个用逗号离隔的表达式。 每一个表达式发生一个参数值,es6语法中能够设置默许参数。假如现实参数值过量,超越的参数值会被疏忽。过少,缺失的值会被替换为undefined。任何范例的值都能够被通报给任何参数。
要领挪用情势 The Method Invocation Pattern
当一个函数被保存为对象的一个属性时,我们称它为一个要领。要领被挪用时,this被绑定在该对象。假如挪用表达式包括一个提取属性的行动(.点表达式或许[subscript]下标表达式),那末它就是被当作一个要领来挪用。
var myObject = { value:0, increment:function(inc) { this.value += typeof inc === "number"?inc:1; } }; myObject.increment(); document.write(myObject.value); // 1 myObject.increment(2); document.write(myObject.value); //3
this 到对象的绑定发生在挪用的时刻。这个“超等”耽误绑定(very late binding)使得函数对this高度复用。
经由过程this可猎取它们所属对象的上下文的要领称为大众要领(public method)函数挪用情势 The Function Invocation Pattern
当一个函数并不是一个对象的属性时,那末它就是被当作一个函数来挪用:
var sum = add(3,4)
this 被绑定到了全局对象上了。倘使言语设想准确,那末当内部函数被挪用时,this应当依然绑定外部函数的this变量。一般定义一个that
变量,并给它赋值为this
。muyObject.double = function(){ var that = this; // 解决要领 var helper = function(){ that.value = add(that.value,that.value); } helper(); // 以函数的情势挪用helper } // 以要领的情势挪用double 。 myObject.double(); document.writeln(myObject.value) // 6;
组织器挪用情势
一个函数,假如建立的目标就是愿望连系new的前缀来挪用,那它就被称为组织器组织。
根据商定,它们保存在以大写花样定名的变量里
JavaScript 是一门基于原型继续的言语。这意味着对象能够直接从其他对象继续属性,同时,他也供应了一套和基于类的言语相似的对象构建语法。
假如在一个函数前面带上new
来挪用。那末背地里将会建立一个衔接到该函数的prototype
成员的新对象,同时this
会被绑定到谁人新对象上。// 建立一个名为Quo的组织器函数,它组织一个带有status属性的对象 var Quo = function(string) { this.status = string; } // 给Quo的一切实例供应一个名为get_status的大众要领 Quo.prototype.get_status = function() { return this.status } // 组织一个Quo 实例 var myQuo = new Quo("confused") document.writeln(myQuo.get_status()); // 显现 "confused"
Apply挪用情势
JavaScript 是一门函数式的面向对象编程言语,所以函数能够具有要领。
apply要领让我们构建一个参数数组通报给挪用函数,同时许可我们挑选this的值。
吸收两个参数,第一个是要绑定给this的值,第二个就是一个参数数组。// 组织一个包括两个数字的数组,并将它们相加。 var array = [3,4]; var sum = add.apply(null,array); // sum 值为7 // 组织一个包括status 成员的对象。 var statusObject = { status:"A-OK" }; // statusObject 并没有继续自Quo.prototype , // 但我们能够在 statusObject上挪用get_status要领,只管statusObject 并没有一个名为get_status的要领。 var status = Quo.prototype.get_status.apply(statusObject); // status 值为 'A-OK'