`
babysuperman
  • 浏览: 1791 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论
阅读更多

Function

 

1.function也是对象

 

在JavaScript中function也是对象,对象可以进行的操作,function都可以,在JavaScript中以下两种写法是基本一样的:

 

function foo() {} // 常规写法
var foo = function() {}; // JavaScript 中function的独特写法

 第二种写法在JavaScript中完全合法,有没有看出function是对象的感觉。引申一下,这么写也是合法的

 

function User() {} // User当做一个对象
User.clone = function() {} // 对象可以拥有属性

 其中User的首字母大写是构造函数的惯例写法,构造函数将在“JavaScript对象(object)”一文中介绍。

 

2.function作用域与闭包

 

JavaScript是以function作为作用域的,那么当两个函数嵌套起来,就构成了JavaScript中的闭包(closure)。例如:

function foo() {
    var i = 2;
    function bar() {
        alert(i); // 可以访问到父函数的变量。
    }
}

 闭包(closure)的完整概念比较复杂,在JavaScript中,简单理解为子函数可以调用父函数的变量,就可以了。

 

3.匿名函数

 

function声明中的函数name是可选的,当函数name不写的时候就是一个匿名函数,匿名函数由于没有name所以适用于只使用一次的情形,例如:

var arr = [ 2, 1, 3 ];
arr.sort(function(obj1, obj2) { 
    return obj2 - obj1;
});//arr.sort(f)的参数为一个用于比较大小进行排序的function

 利用sort使用一个匿名函数作为参数,来进行数组的排序操作。

 

 4.函数重载

 

JavaScript中没有函数重载,按照其他语言中的重载写法(例如Java),变量将会指向最后一个声明的函数,而不会重载,例如:

 

function foo() {
    alert('first func');
}

function foo(name) {
    alert('second func ' + name);
}

foo(); // alert('second func undefined');
foo('bar'); // alert('second func bar');

 

 在JavaScript中没有对函数重载的原生支持,但是我们很容易自己写一个函数来实现函数重载功能。函数重载需要做两件事:确定参数类型和确定参数数量。

 

确定参数类型可以利用typeof或者使用jQuery.type(),例如:

function foo( arg ) {
    if( typeof arg == 'number' ) {
        return 2 + arg;
    } 
    if( typeof arg == 'string' ) {
        return 'this is a string: '+ arg;
    }
}

alert( foo( 1 ) ); //3
alert( foo( 'bar' ) ) //this is a string: bar

 

确定参数类型需要利用function的arguments属性。arguments是类数组,包含了调用函数时传入的参数,但没有数组的pop(),push()等操作。例如:

function addAll() {
    var sum = 0;
    for (var i = 0; i < arguments.length; i++ ) {
        sum += arguments[i];
    }
    return sum;
}

addAll(1, 2, 3, 4); //10

 在编写类库代码时,需要考虑各种情况,也可能需要检查参数的情况。

 

小结:本文主要介绍了JavaScript中的function的特性,function是对象、闭包、匿名函数,以及如何在JavaScript中实现函数重载。

 

小作业:去研究下jQuery.type()函数的源码。有看不懂的地方,可参考lifesinger的github

 

分享到:
评论

相关推荐

    JavaScript基础和实例代码

    第2章 JavaScript语言入门 2.1 编程准备 2.1.1 编程术语 2.1.2 脚本执行顺序 2.1.3 大小写敏感 2.1.4 空白字符 2.1.5 分号 2.1.6 块 2.2 数值类型 2.2.1 整型和浮点数值 2.2.2 八进制和十六进制 2.3 变量 2.3.1 变量...

    JavaScript高级教程

    第 2 章 ECMAScript 基础...............................................9 2.1 语法..............................................9 2.2 变量..............................................10 2.3 关键字........

    jQuery详细教程

    基础语法是:$(selector).action() • 美元符号定义 jQuery • 选择符(selector)“查询”和“查找” HTML 元素 • jQuery 的 action() 执行对元素的操作 示例 $(this).hide() - 隐藏当前元素 $("p").hide() - ...

    Java/JavaEE 学习笔记

    第二章 基础知识.....96 第三章 泛型...........101 第四章 Annotation.102 XML学习笔记...............106 XML前言...............106 第一章 XML Overview....................107 第二章 DTD...........109 第三...

    J2EE学习笔记(J2ee初学者必备手册)

    第二章 基础知识.....96 第三章 泛型...........101 第四章 Annotation.102 XML学习笔记...............106 XML前言...............106 JavaEE@xuxiang 2 Java/JavaEE学习笔记Jonny xuxiang5612@sina.com 第一章 XML...

    精通JS脚本之ExtJS框架.part2.rar

    第2章 JavaScript浏览器对象模型与事件处理 2.1 浏览器对象模型 2.1.1 文档对象 2.1.2 表单及其元素对象 2.1.3 浏览器信息对象 2.1.4 窗口对象 2.1.5 网址对象 2.1.6 历史记录对象 2.2 基本事件处理 2.3 2...

    重学 JS:为啥 await 不能用在 forEach 中详解

    这是重学 JS 系列的第三篇文章,写这个系列的初衷也是为了夯实自己的 JS 基础或者了解一些之前不知道的东西。既然是重学,肯定不会从零开始介绍一个知识点,如有遇到不会的内容请自行查找资料。 不知道你有没有写过...

    精通JS脚本之ExtJS框架.part1.rar

    第2章 JavaScript浏览器对象模型与事件处理 2.1 浏览器对象模型 2.1.1 文档对象 2.1.2 表单及其元素对象 2.1.3 浏览器信息对象 2.1.4 窗口对象 2.1.5 网址对象 2.1.6 历史记录对象 2.2 基本事件处理 2.3 2...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    第2篇 常用技术篇 第4章 文件操作 284 4.1 文件上传 285 实例223 以二进制形式上传文件到数据库 285 实例224 上传文件到服务器 287 实例225 限制上传文件的大小 288 实例226 限制上传文件的类型 291 实例227 上传多...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

     第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高。不要害怕和逃避,毕竟我们还年轻。  本文共分五大部分。分别是XML快速入门,XML的概念,XML的术语,XML的实现,XML的实例分析。最后附录介绍了...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    第2篇 常用技术篇 第4章 文件操作 284 4.1 文件上传 285 实例223 以二进制形式上传文件到数据库 285 实例224 上传文件到服务器 287 实例225 限制上传文件的大小 288 实例226 限制上传文件的类型 291 实例227 上传多...

    Ext Js权威指南(.zip.001

    第2章 从“hello world”开始 / 34 2.1 获取ext js 4 / 34 2.2 配置使用ext js库 / 35 2.3 编写“hello world”程序 / 37 2.4 关于ext.onready / 38 2.5 关于ext.blank_image_url / 40 2.6 关于字体 / 42 2.7...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    第二章 系统设计 2.1. 系统分析 在整个blog进行开发之前,要确定出整个项目的整体架构,包括系统的选型、运行环境的确定及系统结构设计。下面对这进行详细介绍。 在进行软件系统开发的最初环节,一般都需要进行...

Global site tag (gtag.js) - Google Analytics