JavaScript权威指南之学习笔记(第六版)(6)

2019-01-07 18:26

一般argumetns对象来编写这样的函数:期待固定数目的具有名

字的且必须的函数,紧接着是任意数目的没有命名的可选参数。

Arguments[]数组和命名了的参数不过是引用同一变量的两种不

同方法。相反,用参数名改变一个参数的值同时会改变通过arguments数组获得的值;通过arguments[]数组改变参数的值同样会改变用参数名获取的参数值。

记住,arguments只是一个普通的JS标识符,而不是一个保留字,

如果函数有一个参数或者局部变量使用了这个名字,它就会隐藏对arguments对象的引用。

属性callee

arguments对象用callee属性来引用当前正在执行的函数!!

8.4作为方法的函数

Var calculator={

Operand1:1, Operand2:2,

Compute:function(){

This.result=this.operand1+this.operand2;}

任何用作方法的函数都被效地传递了一个隐式的参数,即this,调用对象。 当一个函数作为函数而不是作为方法调用的时候,这个this关键字引用全局对象.

当一个嵌套的函数(作为函数)在一个包含的函数之中调用,而这个包含的函数是作为方法调用的,this关键字在包含的函数中有一个值,但是它却引用嵌套的函数体的内部的全局对象。

8.6 函数的属性和方法

8.6.1属性length

这个属性是只读属性,返回的是函数需要的实际参数的数目,也就

是在函数的开式参数列表中声明的形式参数的数目。注意,和arguments.length不同,这个length属性在函数体的内部和外部都有效。

8.6.3定义自己的函数属性

当函数需要使用一个在调用过程中都保持不变的值时,使用functi

on对象的属性比定义全局变量更加方便。也即我们可以为函数定义属性。

例:

UniqueInteger.counter=0; Function uniqueInteger(){

Return uniqueInteger.counter++;}

这里的counter相当于函数的静态局部变量一样!!! 8.6.4方法apply()和call()

call和apply的第一个参数都是要调用函数的对象,在函数体内这

一参数是关键字this值。call()剩余的参数是传递给要调用的函数的值。

例:

f.call(o,1,2)

上例是把两个数字传递给函数f(),并将它作为对象的方法调用。 apply()传递给函数的参数是由数组指定的。 f.apply(o,[1,2]):

8.8函数作用域和闭包

8.8.1词法作用域

JS函数是通过记法来划分作用域的,而不动态地划分作用域的。

这意味着,它们在定义它们的作用域里运行,而不是在执行它们的作用域里运行。当定义一个函数时,当前的作用域链就保存起来,并且成为函数的内部状态的一部分。在最顶级,作用域链仅由全局对象组成,而并不和词法作用域相关。当定义一个嵌套的函数时,作用域链就包括外围的函数。这意味着嵌套的函数可以访问包含函数的所有参数和局部变量。

8.8.2 调用对象

当JS解释器调用一个函数时,它首先将作用域设置为定义函数

的时候起作用的那个作用域链。接下来,它在作用域的前面添加一个新对象,即调用对象。然后把函数内的传递的参数和局部变量及Arguments对象都放在调用对象中

8.8.4作为闭包的嵌入函数

如果定义了一个嵌套的函数,这个函数引用了调用对象,因为调

用对象在这个函数所定义的作用域链的顶端。如果一个嵌套的函数只是在外围函数的内部使用,那么,对嵌套函数的唯一引用在调用对象之中。当外围函数返回的时候,嵌套的函数引用了调用对象,并且调用对象引用了嵌套的函数,(互相引用??)但是没有其它的东西引用它们二者,因此对这两个对象进行垃圾回收。(看看全局对象和调用对象的说法,就能理解嵌套函数引用了调用对象和调用对象引用了嵌套的函数)

如果把一个嵌套的函数的引用保存到一个全局作用域中,情况不

同了。使用嵌套函数作为外围函数的返回值,或者把嵌套的函数存储为某个其他对象的属性来做到这一点。在这种情况下,有一个对嵌套的函数的外部引用,并且嵌套的函数将它的引用保留给外围函数的调用对象。结果是外围函数的一次特定调用的调用对象依然存在,函数的参数和局部变量的名字和值在这个对象中得以维持。JS代码不会以任何方式访问这个调用对象,但是它所定义的属性是对嵌套函数任何调用的作用域链的一部分。(注:如果一个外围函数存储了两个嵌套函数的全局引用,这两个嵌套函数共享同一个调用对象,并且,一个函数的一次调用所做出的改变对于另一个函数的调用来说也是可见的)

JS函数是将要执行的代码以及执行这些代码的作用域构成一个

综合体,叫闭包。

JS解释器调用一个函数时,会创建一个执行环境,而一个执行

环境是和作用域链相关的。例子:

function a() {

var i = 0;

function b() {

alert(++i);

}

return b;

}

var c = a();

c();

1. 当定义函数a的时候,js解释器会将函数a的作用域链(scope chain)设置为定义a时a所在的“环境”,如果a是一个全局函数,则scope chain中只有window对象。

2. 当执行函数a的时候,a会进入相应的执行环境(excution context)。 3. 在创建执行环境的过程中,首先会为a添加一个scope属性,即a的作用域,其值就为第1步中的scope chain。即a.scope=a的作用域链。 4. 然后执行环境会创建一个活动对象(call object)。活动对象也是一个拥有属性的对象,但它不具有原型而且不能通过JavaScript代码直接访问。创建完活动对象后,把活动对象添加到a 的作用域链的最顶端。此时a的作用域链包含了两个对象:a的活动对象和window对象。

5. 下一步是在活动对象上添加一个arguments属性,它保存着调用函数a时所传递的参数。把所有函数a的形参和内部的函数b的引用也添加到a的活动对象上。在这一步中,完成了函数b的的定义,因此如同第3步,函数b的作用域链被设置为b所被定义的环境,即a的作用域。 九、类、构造函数和原型

JS中函数是特殊对象,而且这个特殊对象是有属性和方法的,那么如果用函数名去调用它自身的方法,方法中this指向的就是这个函数!Jquery中S的extend方法就是这样!Jquery函数,extend就是它的方法!

9.1构造函数

通过构造函数首字母大写,以区分普通函数。实际上它们是没有区别的! Function Car(){}

9.2原型和继承

JS对象从它的原型那里继承属性


JavaScript权威指南之学习笔记(第六版)(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2017-3-2监理例会纪要

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: