说起来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>
相关推荐
5. **模型设定**:在Frontier4.1中,用户可以选择不同的生产函数模型,如邓洛普-斯蒂克兰模型(Dundrop-Stickland)、阿弗雷德-切比雪夫模型(Chebyshev Function)等,这些模型用于刻画效率边界并估计个体效率得分...
你可以定义字段(fields),并设置数据类型,如字符串、数字等。模型还提供了数据验证和与服务器交互的功能,通过`Ext.data.Store`来管理数据集合。 例如: ```javascript Ext.define('User', { extend: 'Ext.data...
9. **函数式编程**:引入了函数接口和一些实用的函数类,支持函数式编程风格,如Function、Predicate等。 10. **算法**:提供了一些算法,如查找最大最小元素、排序算法、集合的归并等。 11. **类型安全**:很多类...
例如,一个函数返回`(Int, (String, Double))`类型的元组,可以直接用`(a, (b, c)) = function()`这样的方式解包,而无需先赋值给一个临时变量再进行逐层解包。 Swift 4.1还增强了对API命名规则的检查。在这一版本...
除了基本的函数调用外,`CallFunction` 还支持更复杂的数据类型传递,例如XML对象。这使得我们可以更加灵活地控制Flash中的内容。 ##### 4.1 XML 数据传递 例如,如果需要向Flash文件传递一个XML数据包,可以这样...
$(document).ready(function () { $("#jqGrid").jqGrid({ url: 'DataServlet', // 这是获取/提交数据的服务器端地址 datatype: 'json', mtype: 'POST', colModel: [ // 定义列 { label: 'Id', name: 'id', key...
### Ext JS 4.1中的`Ext.apply`与`Ext.override` #### 一、Ext.apply详解 `Ext.apply`是Ext JS框架中的一个核心方法,主要用于对象的属性合并。此方法能够将一个或多个对象的属性复制到目标对象中,从而实现对象...
### V4.1版本网关搭建开发环境配置(IAM6.0) #### 一、网关搭建与开发环境配置 本文档主要介绍了派拉前端开发环境下网关的配置方法,适用于IAM版本6.0及以上的系统。通过详细的步骤指导用户完成开发环境的搭建...
* 5.7 需要了解的其他类型:TypeScript 的其他类型,例如 void、object、unknown、never、Function 等。 * 5.8 函数展开运算符:TypeScript 的函数展开运算符。 * 5.9 参数解构:TypeScript 的参数解构。 * 5.10 ...
- **2.5.4.1 数据包类型结构 (struct packet_type)** - 描述了不同数据包类型的处理逻辑。 - **2.5.4.2 添加数据包类型 (Function dev_add_pack())** - 用于将特定的数据包类型与网络设备关联起来。 - **2.5.5 ...
#### 4.1 类型 [dcl.type] 在 C++ 中,每个标识符(名称)都有一个与之关联的类型。这个类型决定了可以对该标识符(即它所表示的对象或函数)执行哪些操作以及这些操作如何被解释。例如,在下面的代码片段中: ```...
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...
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...
- **函数类型(Function Type)**:表示从一种类型到另一种类型的映射。 ### 三、数学结构与计算模型 #### 3.1 结构与模型的关系 数学结构提供了一种形式化的手段来描述现实世界中的现象,而计算模型则是这些结构在...
在上面的代码中,`produces="text/event-stream"` 指定了响应的媒体类型为 `text/event-stream`,这是一种特殊的媒体类型,用于服务器端推送。 在浏览器端,可以使用 `EventSource` 对象来监听服务器端推送的事件。...
- **功能点定义**:功能点是一种量化软件规模的方法,通过统计软件中特定类型的输入、输出、查询、文件和接口等元素的数量来衡量软件的大小。 - **计数标准**:功能点计数有严格的标准和流程,包括如何识别和分类...
4.1 Member的各种调用方式 Nonstatic Member Functions(非静态成员函数) Virtual Member Functions(虚拟成员函数) Static Member Functions(静态成员函数) 4.2 Virtual Member Functions(虚拟成员函数) 多重...
- **4.1 Type Specifier Symbols 类型限定符符号**:介绍了用于指定类型的符号。 - **4.2 Type Specifier Lists 类型限定符列表**:解释了如何使用列表来指定复合类型。 - **4.3 Predicating Type Specifiers 断言...
接下来,我们将分别探讨这两种类型的插件开发方法。 #### 三、类级别的插件开发 类级别的插件开发主要是为了给jQuery增加新的功能,使这些功能能够以全局的方式被调用。 ##### 3.1 添加一个新的全局函数 ```...
##### 4.1 回调函数简介 回调函数是在程序的某个时刻被调用的函数,通常用于实现异步处理或者事件驱动模型。在C语言中,可以使用函数指针作为回调函数的载体;而在C++中,则可以使用成员函数作为回调函数。 ##### ...