javascript权威指南

上传人:今*** 文档编号:105682442 上传时间:2019-10-13 格式:DOC 页数:10 大小:60KB
返回 下载 相关 举报
javascript权威指南_第1页
第1页 / 共10页
javascript权威指南_第2页
第2页 / 共10页
javascript权威指南_第3页
第3页 / 共10页
javascript权威指南_第4页
第4页 / 共10页
javascript权威指南_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《javascript权威指南》由会员分享,可在线阅读,更多相关《javascript权威指南(10页珍藏版)》请在金锄头文库上搜索。

1、JavaScript权威指南 - 函数函数本身就是一段JavaScript代码,定义一次但可能被调用任意次。如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法。用于初始化一个新创建的对象的函数被称作构造函数。相对于其他面向对象语言,在JavaScript中的函数是特殊的,函数即是对象。JavaScript可以把函数赋值给变量,或者作为参数传递给其他函数,甚至可以给它们设置属性等。JavaScript的函数可以嵌套在其他函数中定义,这样定义的函数就可以访问它们外层函数中的任何变量。这也就是所谓的“闭包”,它可以给JavaScript带来强劲的编程能力。1.函数定义函数使用

2、function关键字定义,有函数语句和函数表达式两种定义方式。/一.函数语句类:/打印对象所有属性名称和值。function printprops(obj) for (var key in obj) console.log(key + : + objkey); /计算阶乘的递归函数,函数名称将成为函数内部的一个局部变量。function factorial(n) if (n = 1) return 1; return n * factorial(n);/二.函数表达式类:/计算n的平方的函数表达式。这里将一个函数赋给一个变量。var square = function (x) return

3、x * x; /兔子数列。函数表达式也可以包含名称,方便递归。var foo = function foo(n) if (n = 1) return 1; else foo(n - 1) + foo(n - 2);/数组元素升序排列。函数表达式也能作为参数传递给其他函数。var data = 5, 3, 7, 2, 1;data.sort(function (a, b) return a - b; );/函数表达式有时定义后立即调用。var tensquared = (function (x) return x * x; (10);函数命名函数名称要求简洁、描述性强,因为这样可以极大改善代码的

4、可读性,方便别人维护代码;函数名称通常是动词或以动词开头的词组。通常来说,函数名编写有两种约定:一种约定是函数名第一个单词首字母小写,后续单词首字母大写,就像likeThis();当函数名包含多个单词时,另一种约定是用下划线来分割单词,就像like_this()。项目中编写方法名时尽量选择一种保持代码风格一致。还有,对于一些私有函数(不作为公用API的一部分),这种函数通常以一条下划线作为前辍。2.函数调用函数声明后需要通过调用才能被执行。JavaScript中通常有4种方式来调用函数:作为普通函数;作为对象方法;作为构造函数;通过它们的call()和apply()方法间接调用。下面就通过一些

5、具体示例来演示上述4中函数的调用方式。1.对于普通函数,通过调用表达式就可直接调用,这种方式很直接也很常见。/定义一个普通函数。var strict = function () return !this; ; /检测当前运行环境是否为严格模式。/通过函数名直接调用。console.log(strict(); 注:根据ES3和非严格的ES5对普通函数调用的规定,调用上下文(this)是全局对象;在严格模式下,调用上下文则是undefined。2.通常,保存在对象属性里的JavaScript函数被称作“方法”。/定义一个对象直接量。var calc = a: null, b: null, add:

6、 function () /将函数保存在对象属性中。 return this.a + this.b; ;/通过对象名调用方法。calc.a = 1, calc.b = 2;console.log(calc.add(); 注:对象方法中的调用上下文(this)不同于普通函数中的上下文。这里this指代当前对象。方法链:当方法返回值是一个对象,那么这个对象还可以再调用它的方法。每次调用的结果都是另外一个表达式的组成部分,这种方法调用方式最终会形成一个序列,也被称为“方法链”。所以,在自己设计API的时候,当方法并不需要返回值时,最好直接返回this。这样以后使用API就可以进行“链式调用”风格的编

7、程。需要注意的是,this是一个关键字,Javascript语法不允许给它赋值。再者,关键字this没有作用域的限制,嵌套的函数不会从外层调用它的函数中继承this。也就是说,如果嵌套函数作为方法调用,其this指向为调用它的对象。如果嵌套函数作为函数调用,其this值不是全局对象就是undefined。下面通过一段代码来具体说明。var o = m: function () /对象中的方法 var self = this; /将this的值保存在一个变量中 console.log(this = o); /输出true,表明this就是这个引用对象o f(); /调用嵌套函数f() funct

8、ion f() /定义一个嵌套函数(*普通函数,非对象方法) console.log(this = o); /输出false,this的值为全局对象或undefined console.log(self = o); /输出true,变量self指外部函数的this值 3.如果函数或者防方法调用之前带有关键字new,它就构成构造函数调用。构造函数调用会创建一个新的对象,构造函数通常不使用return,函数体执行完毕它会显示返回。还有,创建的对象继承自构造函数的prototype属性,构造函数中使用this关键字来引用这个新创建的对象。/与普通函数一样的定义方式。function Person(n

9、ame, age) this.name = name; this.age = age; this.say = function () console.log(My name is + this.name + , I am + this.age + years old.); /用关键字new调用构造函数,实例化对象。var obj = new Person(Lamb, 21);obj.say();/调用对象方法。4.我们知道Javascript中的函数也是对象,所以函数对象也是可以包含方法的,其中call()和apply()两个方法可以用来间接地调用函数,这两个方法都可以显式指定调用函数里面的调

10、用上下文this。/定义一个打印函数。function print() if (this.text) alert(this.text); else alert(undefined); /call方法间接调用方法,并指定其调用上下文。print.call( text: hello );关于call()和apply()两个方法的用法以及区别下面详细讨论。3.函数的实参和形参JavaScript中的函数定义不需要指定函数形参的类型,调用函数时也不检查传入形参的个数。这样,同时也会留下两个疑问给我们:当调用函数时的实参个数和声明的形参个数不匹配的时候如何处理;如何显式测试函数实参的类型,以避免非法的实

11、参传入函数。下面就简单介绍JavaScript是如何对上述两个问题做出处理的。可选参数当调用函数的时候传入的实参比函数定义时指定的形参个数要少,剩下的形参都将设置为undefined。一般来说,为了保持函数较好的适应性,都会给省略的参数设置一个合理的默认值。function getPropertyNames(obj,/*optional*/arr) arr=arr|; for (var property in obj) arr.push(property); return arr;需要注意的是,当使用这种可选实参来实现函数时,需要将可选实参放在实参列表的最后。一般来书,函数定义中使用注释/*o

12、ptional*/来强调形参是可选的。实参对象当调用函数时传入的参数个数超过了原本函数定义的形参个数,那么方法中可以通过实参对象来获取,标识符arguments是指向实参对象的引用。实参对象是一个类数组对象,可以通过数字下标来访问传入函数的实参值。实参对象有一个重要的用处,就是让函数可以操作任意数量的实参,请看下面的例子:/返回传入实参的最大值。function max(/* . */) var max = Number.NEGATIVE_INFINITY; /该值代表负无穷大。 for (var i = 0; i max) max = argumentsi; return max;/调用。v

13、ar largest = max(10, 45, 66, 35, 21); /=66还有重要的一点,如果函数中修改arguments元素,同样会影响对应的实参变量。除以上之外,实参对象还包含了两个属性callee和caller:callee是ECMAScript标准规范的,它指代当前正在执行的函数。caller是非标准属性但是大多数浏览器都支持,它指代当前正在执行函数的函数。/callee可以用来递归匿名函数。var sum = function (x) if (x = 1) return 1; return x + arguments.callee(x - 1);/调用函数b,方法a中打印结

14、果为函数b。 var a = function () alert(a.caller); var b = function () a(); 注意,在ECMAScript 5严格模式下,对这两个属性进行读写会产生一个类型错误。实参类型声明JavaScript函数时形参不需要指定类型,在形参传入函数体之前也不会做任何类型检查,但是JavaScript在必要的时候会进行类型转换,例如:function mult(a, b) return a * b;function conn(x, y) return x + y;console.log(mult(3, 2); /字符串类型自动转为数字类型,输出结果:6console.log(conn(3, 2); /数字类型自动转为字符串

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号