`
weigang.gao
  • 浏览: 491259 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Function类型(4.1)

 
阅读更多

       说起来ECMAScript中什么最有意思,我想那莫过于函数了——而有意思的根源,则在于函数实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数通常是使用函数声明语法定义的,如下面例子所示:

a.使用函数声明语法定义函数

 

function sum(num1, num2){
   return num1+num2;
}

 

b.使用函数表达式定义函数

var sum = function(num1, num2){
  return num1+num2;
};

     以上代码定义了变量sum并将其初始化为一个函数。有读者可能会注意到,function关键字后面没有函数名。这是因为在使用函数表达式定义函数时,没有必要使用函数名——通过变量sum即可以引用函数。另外,还要注意函数末尾有一个分号,就像声明其他变量时一样。

 

 c.最后一种定义函数的方式是使用Function构造函数。Function构造函数可以接受任意数量的参数,但最后一个参数始终都被看成是函数体,而前面的参数则枚举除了新函数的参数

      var sum = new Function(“num1”, “num2”, “return num1+num2”);//为什会解析2次呢?

      从技术角度讲,这是一个函数表达式。但是,我们不推荐读者使用这种方式定义函数,因为这种语法会导致解析两次代码(第一次是解析常规ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能。

 

函数声明与函数表达式

1.  解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其在执行任何代码之前可用;至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

 

2.  在函数内部,有两个特殊的对象:arguments和this。其中,arguments是一个类数组对象,包含着传入函数中的所有参数。虽然arguments的主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

 

3.  函数内部的另外一个特殊对象是this,this引用的是函数据以执行的环境对象(当在网页的全局作用域中调用函数时,this对象引用的就是window)

 

<script type="text/javascript">
         function add(){
              if(window == this){//函数内部的另外一个特殊对象是this,在这里this指向的是全局执行环境
                    alert("window is this");
              }
         }
         add();
 </script>
 
<script type="text/javascript">
        var color = "red";
        function sayColor(){
             return this.color;
        }
        alert(sayColor());
        var obj = {nane : "高伟刚", age : 25, color : "blue"};//这里如果删除了color,会返回undefined。对象中没有属性,会返回undefined
        obj.say = sayColor;
        alert(obj.say());
</script>
 

 

3.caller这个属性中保存着调用当前函数的函数的引用

<script type="text/javascript">
        function say(args){
             sayColor(args);
        }
        function sayColor(args){
             alert(sayColor.caller);
        }
        say();//会弹出调用sayColor函数的函数
        sayColor();//null,全局作用域调用了sayColor函数,所以sayColor.caller == null
</script>

 

函数属性和方法

ECMAScript中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性:length和prototype。其中,length属性表示函数希望接收的命名参数的个数。

 

1.   在ECMAScript核心所定义的全部属性中,最耐人寻味的就要数prototype属性了。对于ECMAScript中的引用类型而言,prototype是保存它们所有实例方法的真正所在。换句话说,诸如toString()和valueof()等方法实际上都保存在prototype名下,只不过是通过各自对象的实例访问罢了。在创建自定义引用类型以及实现继承时,prototype属性的作用是极为重要的。

 

每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。首先,apply()方法接受两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是Array的实例,也可以是arguments对象

 

Call()方法与apply()方法的作用相同,它们的区别仅在于接受参数的方式不同

 

重点:事实上,传递参数并非apply()和call()真正的用武之地;它们正真强大的地方是能够扩充函数赖以运行的作用域。来看下面一个例子。

 <script type="text/javascript">
       function sum(num1, num2){
                alert(num1);//12
                alert(num2);//20
                alert(this.num3);//60
                return num1+num2;
        }
        var obj = {num3 : 60};
        function callSum(obj){
                return sum.apply(obj, arguments);//设置函数体sum中this对象的值为obj,apply和call用途都在特定的作用域中调用函数,实际上等级设置函数体内this对象的值
        }
        var count = callSum(12, 20);
</script>

 

每个函数继承的toLocaleString()和toString()方法始终都返回函数代码。返回函数代码的格式则因浏览器而异——有的返回的代码与源代码中的函数代码一样,而有的则返回函数代码的内部表示,即由解析器删除了注释并对某些代码作了改动后的代码。由于与源代码存在差异,我们无法根据这两个方法返回的结果来实现任何重要功能。另外一个继承的valueOf()方法同样也只能返回函数代码

 

Problem:

Javascript预编译

<script type="text/javascript"> 
	/*1.JavaScript"预编译"会先将变量x进行声明,但不会进行赋值。并且在进行所有操作之前,将函数add会进行预定义
	 *2."预编译"是一段一段的JavaScript代码来进行的
	 */
	alert(x);//undefined,在所有代码执行之前,x已经进行的"预编译"
	add(); //弹出undefined
	var x = 333;/*虽然在所有代码执行之前已经进行的"预编译"(即声明了x)了,但是并有对x赋值。当执行到这行时,才对x赋值,所以下一行调用add()函数时
				  会弹出333。而本上之上调用add(),由于并没有对x赋值,所以会弹出undefined
				*/
	add();//弹出333
	function add(){
	  alert(x);
	}
</script>
分享到:
评论

相关推荐

    关于两个模型面板数据和截面数据的操作.rar_Frontier4.1_frontier4.1操作_frontier4.1教程_截

    5. **模型设定**:在Frontier4.1中,用户可以选择不同的生产函数模型,如邓洛普-斯蒂克兰模型(Dundrop-Stickland)、阿弗雷德-切比雪夫模型(Chebyshev Function)等,这些模型用于刻画效率边界并估计个体效率得分...

    ExtJS4.1实现的mvc模式经典入门案例

    你可以定义字段(fields),并设置数据类型,如字符串、数字等。模型还提供了数据验证和与服务器交互的功能,通过`Ext.data.Store`来管理数据集合。 例如: ```javascript Ext.define('User', { extend: 'Ext.data...

    commons-collections4-4.1-bin.zip

    9. **函数式编程**:引入了函数接口和一些实用的函数类,支持函数式编程风格,如Function、Predicate等。 10. **算法**:提供了一些算法,如查找最大最小元素、排序算法、集合的归并等。 11. **类型安全**:很多类...

    swift-演示Swift4.1中引入的新功能的Xcodeplayground

    例如,一个函数返回`(Int, (String, Double))`类型的元组,可以直接用`(a, (b, c)) = function()`这样的方式解包,而无需先赋值给一个临时变量再进行逐层解包。 Swift 4.1还增强了对API命名规则的检查。在这一版本...

    VC,VB,C#与flash8结合开发中callfunction的运用

    除了基本的函数调用外,`CallFunction` 还支持更复杂的数据类型传递,例如XML对象。这使得我们可以更加灵活地控制Flash中的内容。 ##### 4.1 XML 数据传递 例如,如果需要向Flash文件传递一个XML数据包,可以这样...

    jqGrid 4.1 示例(二)

    $(document).ready(function () { $("#jqGrid").jqGrid({ url: 'DataServlet', // 这是获取/提交数据的服务器端地址 datatype: 'json', mtype: 'POST', colModel: [ // 定义列 { label: 'Id', name: 'id', key...

    ext js 4.1apply && override

    ### Ext JS 4.1中的`Ext.apply`与`Ext.override` #### 一、Ext.apply详解 `Ext.apply`是Ext JS框架中的一个核心方法,主要用于对象的属性合并。此方法能够将一个或多个对象的属性复制到目标对象中,从而实现对象...

    V4.1版本网关搭建开发环境配置(IAM6.0).pdf

    ### V4.1版本网关搭建开发环境配置(IAM6.0) #### 一、网关搭建与开发环境配置 本文档主要介绍了派拉前端开发环境下网关的配置方法,适用于IAM版本6.0及以上的系统。通过详细的步骤指导用户完成开发环境的搭建...

    TypeScript学习文档-基础篇(完结).doc

    * 5.7 需要了解的其他类型:TypeScript 的其他类型,例如 void、object、unknown、never、Function 等。 * 5.8 函数展开运算符:TypeScript 的函数展开运算符。 * 5.9 参数解构:TypeScript 的参数解构。 * 5.10 ...

    Linux环境下网络协议的分析和实现

    - **2.5.4.1 数据包类型结构 (struct packet_type)** - 描述了不同数据包类型的处理逻辑。 - **2.5.4.2 添加数据包类型 (Function dev_add_pack())** - 用于将特定的数据包类型与网络设备关联起来。 - **2.5.5 ...

    The-C++-Programming-Language(ch 4)

    #### 4.1 类型 [dcl.type] 在 C++ 中,每个标识符(名称)都有一个与之关联的类型。这个类型决定了可以对该标识符(即它所表示的对象或函数)执行哪些操作以及这些操作如何被解释。例如,在下面的代码片段中: ```...

    深度神经网络系列视频-Python程序入门.zip

    4.1控制流1IfFor.mp4 4.2控制流2WhileRangePart1.mp4 4.2控制流2WhileRangePart2.mp4 4.3控制流2BreakContinuePass.mp4 5.1输入输出格式IoConsole.mp4 5.2文件输入输出FileIo.mp4 6.1错误与异常ErrorsExceptions.mp4...

    Python培训视频.rar

    4.1控制流1 IfFor.rar 4.2控制流2 WhileRangePart1.rar 4.2控制流2 WhileRangePart2.rar 4.3控制流2 BreakContinuePass.rar 5.1输入输出格式IoConsole.rar 5,2文件输入输出Filelo.rar 6.1错误与异常ErrorsExceptions...

    类别,类型和结构Categories, Types And Structures

    - **函数类型(Function Type)**:表示从一种类型到另一种类型的映射。 ### 三、数学结构与计算模型 #### 3.1 结构与模型的关系 数学结构提供了一种形式化的手段来描述现实世界中的现象,而计算模型则是这些结构在...

    Spring MVC4.1服务器端推送实现过程解析

    在上面的代码中,`produces="text/event-stream"` 指定了响应的媒体类型为 `text/event-stream`,这是一种特殊的媒体类型,用于服务器端推送。 在浏览器端,可以使用 `EventSource` 对象来监听服务器端推送的事件。...

    Function Point Counting Practices Manual 4.1.1 (IFPUG,英文)

    - **功能点定义**:功能点是一种量化软件规模的方法,通过统计软件中特定类型的输入、输出、查询、文件和接口等元素的数量来衡量软件的大小。 - **计数标准**:功能点计数有严格的标准和流程,包括如何识别和分类...

    深度探索C++对象模型 超清版

    4.1 Member的各种调用方式 Nonstatic Member Functions(非静态成员函数) Virtual Member Functions(虚拟成员函数) Static Member Functions(静态成员函数) 4.2 Virtual Member Functions(虚拟成员函数) 多重...

    Common Lisp The Language Second Edition

    - **4.1 Type Specifier Symbols 类型限定符符号**:介绍了用于指定类型的符号。 - **4.2 Type Specifier Lists 类型限定符列表**:解释了如何使用列表来指定复合类型。 - **4.3 Predicating Type Specifiers 断言...

    Jquery插件开发

    接下来,我们将分别探讨这两种类型的插件开发方法。 #### 三、类级别的插件开发 类级别的插件开发主要是为了给jQuery增加新的功能,使这些功能能够以全局的方式被调用。 ##### 3.1 添加一个新的全局函数 ```...

    Function_Pointers

    ##### 4.1 回调函数简介 回调函数是在程序的某个时刻被调用的函数,通常用于实现异步处理或者事件驱动模型。在C语言中,可以使用函数指针作为回调函数的载体;而在C++中,则可以使用成员函数作为回调函数。 ##### ...

Global site tag (gtag.js) - Google Analytics