第11章 Function类型


第11 11 11 11 章Function Function Function Function 类型 学 习要 点: 1.函 数的 声明 方式 2.作 为值 的函 数 3.函 数的 内部 属性 4.函 数属 性和 方法 主讲教师:李炎恢 合作 网站: http://http://http://http://www.ibeifeng.comwww.ibeifeng.comwww.ibeifeng.comwww.ibeifeng.com 讲师博客: http://hi.baidu.com/http://hi.baidu.com/http://hi.baidu.com/http://hi.baidu.com/李炎恢 在ECMAScript 中,Function(函数)类型实际上是对象。每个函数都是Function 类型的 实例,而 且都 与其 他引 用类 型一 样具 有属 性和 方法 。由 于函 数是 对象 ,因 此函 数名 实际 上也 是 一个 指向 函数 对象 的指 针。 一.函 数的 声明 方式 1.普 通的 函数 声明 function box(num1, num2) { return num1+ num2; } 2.使 用变 量初 始化 函数 var box= function(num1, num2) { return num1 + num2; }; 3.使用Function 构 造函 数 var box= new Function('num1', 'num2' ,'return num1 + num2'); PS:第三种方式我们不推荐,因为这种语法会导致解析两次代码(第一次解析常规 ECMAScript 代码,第 二次 是解 析传 入构 造函 数中 的字 符串 ),从 而影 响性 能 。但 我们 可以 通 过 这种 语法 来理 解 "函 数是 对象 ,函 数名 是指 针 "的 概念 。 二 .作 为值 的函 数 ECMAScript 中 的函 数名 本身 就是 变量 ,所 以函 数也 可以 作为 值来 使用 。也 就是 说, 不 仅 可以 像传 递参 数一 样把 一个 函数 传递 给另 一个 函数 ,而 且可 以将 一个 函数 作为 另一 个函 数 的 结果 返回 。 function box(sumFunction, num) { return sumFunction(num); //someFunction } function sum(num) { return num + 10; } var result = box(sum, 10); //传 递函 数到 另一 个函 数里 三.函 数内 部属 性 在 函数 内部 ,有 两个 特殊 的对 象: arguments 和this。arguments 是 一个 类数 组对 象, 包 含 着传 入函 数中 的所 有参 数 ,主 要用 途是 保存 函数 参数 。但 这个 对象 还有 一个 名叫 callee 的 属 性, 该属 性是 一个 指针 ,指 向拥 有这 个 arguments 对 象的 函数 。 function box(num) { if (num <= 1) { return 1; } else { return num * box(num-1); //一 个简 单的 的递 归 } } 对 于阶 乘函 数一 般要 用到 递归 算法 ,所 以函 数内 部一 定会 调用 自身 ;如 果函 数名 不改 变 是 没有 问题 的, 但一 旦改 变函 数名 ,内 部的 自身 调用 需要 逐一 修改 。为 了解 决这 个问 题 ,我 们 可以 使用 arguments.callee 来 代替 。 function box(num) { if (num <= 1) { return 1; } else { return num * arguments.callee(num-1);//使用callee 来 执行 自身 } } 函 数内 部另 一个 特殊 对象 是 this, 其行 为与 Java 和C#中的this 大 致相 似。 换句 话说 , this 引 用的 是函 数据 以执 行操 作的 对象 ,或 者说 函 数调 用语 句所 处的 那个 作用 域 。PS:当在 全 局作 用域 中调 用函 数时 , this 对 象引 用的 就是 window。 //便 于理 解的 改写 例子 window.color = '红 色的 ';//全 局的 ,或 者 var color = '红 色的 ';也行 alert(this.color); //打 印全 局的 color var box = { color :'蓝 色的 ',//局 部的 color sayColor : function (){ alert(this.color); //此 时的 this 只能box 里的color } }; box.sayColor(); //打 印局 部的 color alert(this.color); //还 是全 局的 //引 用教 材的 原版 例子 window.color = '红 色的 ';//或者var color = '红 色的 ';也行 var box = { color :'蓝 色的 ' }; function sayColor() { alert(this.color); //这 里第 一次 在外 面 ,第 二次 在 box 里面 } getColor(); box.sayColor = sayColor; //把 函数 复制 到 box 对 象里 ,成 为了 方法 box.sayColor(); 四.函 数属 性和 方法 ECMAScript 中 的函 数是 对象 ,因 此函 数也 有属 性和 方法 。每 个函 数都 包含 两个 属性 : length 和prototype。 其中 , length 属 性表 示函 数希 望接 收的 命名 参数 的个 数。 function box(name, age) { alert(name + age); } alert(box.length); //2 PS:对于prototype 属性,它 是保 存所 有实 例方 法的 真正 所在 ,也 就是 原型 。这 个属 性 , 我 们将 在面 向对 象一 章详 细介 绍 。而prototype 下 有两 个方 法 :apply()和call(),每 个函 数都 包 含这 两个 非继 承而 来的 方法 。这 两个 方法 的用 途都 在特 定的 作用 域中 调用 函数 ,实 际上 等 于 设置 函数 体内 this 对 象的 值。 function box(num1, num2) { return num1 + num2; //原 函数 } function sayBox(num1, num2) { return box.apply(this, [num1, num2]); //this 表 示作 用域 ,这 里是 window }//[]表示box 所 需要 的参 数 function sayBox2(num1, num2) { return box.apply(this, arguments); //arguments 对 象表 示 box 所 需要 的参 数 } alert(sayBox(10,10)); //20 alert(sayBox2(10,10)); //20 call()方 法于 apply()方 法相 同 ,他 们的 区别 仅仅 在于 接收 参数 的方 式不 同 。对于call()方 法 而言 ,第 一个 参数 是作 用域 ,没 有变 化, 变化 只是 其余 的参 数都 是直 接传 递给 函数 的。 function box(num1, num2) { return num1 + num2; } function callBox(num1, num2) { return box.call(this, num1, num2); //和apply 区 别在 于后 面的 传参 } alert(callBox(10,10)); 事 实上 ,传 递参 数并 不是 apply()和call()方 法真 正的 用武 之地 ;它 们经 常使 用的 地方 是 能 够扩 展函 数赖 以运 行的 作用 域。 var color = '红 色的 ';//或者window.color = '红 色的 ';也行 var box = { color :'蓝 色的 ' }; function sayColor() { alert(this.color); } sayColor(); //作 用域 在 window sayColor.call(this); //作 用域 在 window sayColor.call(window); //作 用域 在 window sayColor.call(box); //作 用域 在 box, 对象 冒充 这 个例 子是 之前 作用 域理 解的 例子 修改 而成 ,我 们可 以发 现当 我们 使用 call(box)方 法的 时 候, sayColor()方 法的 运行 环境 已经 变成 了 box 对 象里 了。 使用call()或者apply()来 扩充 作用 域的 最大 好处 ,就 是对 象不 需要 与方 法发 生任 何耦 合 关系(耦 合, 就是 互相 关联 的意 思, 扩展 和维 护会 发生 连锁 反应 )。 也就 是说 , box 对象和 sayColor()方 法之 间不 会有 多余 的关 联操 作, 比如 box.sayColor = sayColor; 感谢收看本次教程! 本 课程 是由 北风 网 (ibeifeng.com)(ibeifeng.com)(ibeifeng.com)(ibeifeng.com) 瓢城Web Web Web Web 俱 乐部 (yc60.com)(yc60.com)(yc60.com)(yc60.com)联合提 供: 本 次主 讲老 师: 李 炎恢 我 的博 客: hi.baidu.com/hi.baidu.com/hi.baidu.com/hi.baidu.com/李 炎恢 //// 我 的邮 件 :yc60.com@gmail.comyc60.com@gmail.comyc60.com@gmail.comyc60.com@gmail.com
还剩4页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 2 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

java-man

贡献于2013-11-12

下载需要 2 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf