JavaScript学习09 函数本质及Function对象深入探索

  在JavaScript中,函数function就是对象。

JS中没有方法重载

  在JavaScript中,没有方法(函数)重载的概念。

  例子:

<html>
<head>
<script type="text/javascript"> function add(number)
{
alert(number + 20);
} function add(number, number1)
{
alert(number + 30);
} add(10);
</script>
</head> <body> </body> </html>

  网页中弹框显示的是40。

  说明虽然第二个方法是两个参数,但是仍然调用了它。

  交换两个方法的顺序之后,弹框显示30,可以看出不管参数个数如何,是调用同名的后面的方法。

  怎么解释这个现象?

  这是因为函数声明实际上是建立了一个对象

<html>
<head>
<script type="text/javascript"> function add(number)
{
alert(number + 20);
}
/*
上面的函数等价于:
var add = function(number)
{
alert(number + 20);
}
*/
function add(number, number1)
{
alert(number + 30);
}
/*
上面的函数等价于:
var add = function(number, number1)
{
alert(number + 30);
}
*/
add(10); </script>
</head>
<body>
</body>
</html>

  这样add实际指向的是后面的对象,而方法调用的时候赋予的参数将会按顺序赋给方法形式参数,后面没有被赋值的参数就是undefined。

  JavaScript的函数调用的时候没有严格的参数个数检查,实参个数小于形参个数是可以的,没有被赋值的形参就是未定义值undefined。

  实参个数大于形参个数也是可以的,这样只有前面的实参会被使用,多出来的实参不会被使用。

Function对象

  在JavaScript中有一个Function对象,所有自定义的函数都是Function对象类型的。

  Function对象接收的所有参数都是字符串类型的,其中最后一个参数就是要执行的函数体,而前面的参数则是函数真正需要接收的参数。

  例子:

<html>
<head>
<script type="text/javascript"> var add = new Function("number", "number1", "alert(number + number1);"); var add = new Function("number", "alert(number + 20);"); add(10, 30); </script>
</head>
<body>
</body>
</html>

  

隐含对象arguments

  在JavaScript中,每个函数都有一个隐含的对象arguments,表示给函数实际传递的参数。

  arguments和函数的形式参数及其个数无关。

  arguments有个有用的属性length,表示实参的长度。可以借助这个来模拟出函数的重载:

  练习例子:

<html>
<head>
<script type="text/javascript"> function add(number1, number2)
{
alert(arguments.length);
alert(arguments[0]);
alert(arguments[1]);
alert(arguments[2]);
}
//add(2, 3, 4); function add2()
{
if(1 == arguments.length)
{
alert(arguments[0]);
}
else if(2 == arguments.length)
{
alert(arguments[0] + arguments[1]);
}
else if(3 == arguments.length)
{
alert(arguments[0] + arguments[1] + arguments[2]);
}
} add2(3);
add2(3, 4);
add2(3, 4, 5); </script>
</head> <body>
</body>
</html>

  每一个函数对象都有一个length属性,表示该函数期望接收的参数格式。

  它与函数的arguments不同,arguments.length表示函数实际接收的参数个数

  例子:

<html>

    <head>
<script type="text/javascript"> var add = function(num, num2, num3)
{
alert(num + num2 + num3);
} alert(add.length); //输出3
add(1, 2, 3); var add2 = function()
{ } alert(add2.length); //输出0 </script> </head> <body> </body>
</html>

参考资料

  圣思园张龙老师Java Web视频教程。

  W3School JavaScript教程:http://www.w3school.com.cn/js/index.asp

  英文版:http://www.w3schools.com/js/default.asp

JavaScript学习09 函数本质及Function对象深入探索的更多相关文章

  1. javascript 学习总结(五)Function对象

    1.Function  函数调用(类似call方法) function callSomeFunction(someFunction, someArgument){ return someFunctio ...

  2. JavaScript学习总结(四)function函数部分

    转自:http://segmentfault.com/a/1190000000660786 概念 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. js 支持两种函数:一类是语言内部的函数 ...

  3. Javascript学习5 - 函数

    原文:Javascript学习5 - 函数 在Javascript中,函数和对象是交织在一起的.有些函数的特性与对象相关联.这一点的内容在第六部分会讨论到. 这一部分主要讨论函数与其它比较熟悉的语言( ...

  4. Javascript学习之函数(function)

    在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针. 一 函 ...

  5. JavaScript学习笔记(十四)——对象

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  6. JavaScript学习笔记——函数

    javascript函数的声明和调用 将完成某一特定功能的代码集合起来,可以重复使用的代码块. 一.函数的声明方式(创建) A.基本语法 function 关键字 function 函数名([参数1] ...

  7. JavaScript基础知识(JSON、Function对象、原型、引用类型)

    19.JSON 概念:JavaScript 对象表示法(JavaScript Object Notation),是一种轻量级的数据交换格式  特点:易于程序员编写和查看:易于计算机解析和生成 数据结构 ...

  8. JavaScript学习笔记-函数

    函数的两种创建方式:函数定义表达式.函数声明语句 编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用: 而函数表达式创建的函数,要调用它必须赋值给一个变量,编 ...

  9. javascript学习(三) 内置对象

    一:事件(Event)对象 在触发dom事件的时候都会产生一个event对象 type   获取事件类型 target  获取事件目标 stopPropagation()  阻止事件冒泡 preven ...

随机推荐

  1. 简单设置,解决使用webpack前后端跨域发送cookie的问题

    最近用vue来做项目,用webpack来做前端自动化构建.webpack-dev-server会在本地搭建一个服务器,在和后端调试的时候,就会涉及到跨域的问题. 刚开始时,没有用vue-cli来构建项 ...

  2. QT学习笔记5

    Qt标准对话框之QFileDialog //QString path=QFileDialog::getOpenFileName(this,tr("open image"),&quo ...

  3. Hyperledger区块数据的访问

    简介 本文介绍了访问Hyperledger区块数据的几种方法. REST API Hyperledger提供了多个REST API (https://hyperledger-fabric.readth ...

  4. 运用javascript的成员访问特性来实现通用版的兼容所有浏览器的打开对话框功能

    打开网页对话框,一般有三种方法:window.open.window.showModalDialog.window.showModelessDialog,每一种都有它的优点与不足.第一种方法:wind ...

  5. 使用James搭建一个自己的邮箱服务器

    ---第一天开发--- 下载Apache James 3.0邮箱服务器,解压到响应的目录 可以看到目录结构: H:\code\JavaCode\James\apache-james-3.0-beta4 ...

  6. log4net 既要按日期分割日志文件,又要按文件大小分割。

    <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender"> ...

  7. [Asp.net 5] Configuration-新一代的配置文件(接口定义与基础实现)

    关于配置文件的目录:[Asp.net 5] Configuration-新一代的配置文件 本系列文章讲的是asp.net 5(Asp.net VNext)中的配置文件部分,工程下载地址为:https: ...

  8. Winform开发框架之读卡器和条码扫描枪的数据接收处理

    在我们开发一些项目的时候,一般需要一些外围的设备进行数据处理,如ID/IC读卡器获取卡号.激光条码扫描枪.USB摄像头.USB方式的小票据打印机(POS打印机).USB来电录音盒.普通打印机等一系列附 ...

  9. 创建Oracle数据库

    [root@localhost ~]# su - oracle [oracle@localhost ~]$ sqlplus /nolog SQL> conn /as sysdba; SQL> ...

  10. Redis系列三之持久化

    一.Redis持久化 Redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化. redis提供了不同级别的持久化方法: Snapshotting(快照,默认方式 ...