JavaScript学习09 函数本质及Function对象深入探索
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对象深入探索的更多相关文章
- javascript 学习总结(五)Function对象
1.Function 函数调用(类似call方法) function callSomeFunction(someFunction, someArgument){ return someFunctio ...
- JavaScript学习总结(四)function函数部分
转自:http://segmentfault.com/a/1190000000660786 概念 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. js 支持两种函数:一类是语言内部的函数 ...
- Javascript学习5 - 函数
原文:Javascript学习5 - 函数 在Javascript中,函数和对象是交织在一起的.有些函数的特性与对象相关联.这一点的内容在第六部分会讨论到. 这一部分主要讨论函数与其它比较熟悉的语言( ...
- Javascript学习之函数(function)
在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针. 一 函 ...
- JavaScript学习笔记(十四)——对象
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- JavaScript学习笔记——函数
javascript函数的声明和调用 将完成某一特定功能的代码集合起来,可以重复使用的代码块. 一.函数的声明方式(创建) A.基本语法 function 关键字 function 函数名([参数1] ...
- JavaScript基础知识(JSON、Function对象、原型、引用类型)
19.JSON 概念:JavaScript 对象表示法(JavaScript Object Notation),是一种轻量级的数据交换格式 特点:易于程序员编写和查看:易于计算机解析和生成 数据结构 ...
- JavaScript学习笔记-函数
函数的两种创建方式:函数定义表达式.函数声明语句 编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用: 而函数表达式创建的函数,要调用它必须赋值给一个变量,编 ...
- javascript学习(三) 内置对象
一:事件(Event)对象 在触发dom事件的时候都会产生一个event对象 type 获取事件类型 target 获取事件目标 stopPropagation() 阻止事件冒泡 preven ...
随机推荐
- Azure PowerShell (1) PowerShell整理
<Windows Azure Platform 系列文章目录> 把之前Azure ASM的PowerShell都整理好了. https://github.com/leizhang1984/ ...
- C#2.0 to 4.0
//xmlElement.set_InnerText(value); xmlElement.InnerText = value; ).ToCharArray());//Convert.ToChar(s ...
- 【原创】Kakfa common包源代码分析
初一看common包的代码吓了一跳,这么多scala文件!后面仔细一看大部分都是Kafka自定义的Exception类,简直可以改称为kafka.exceptions包了.由于那些异常类的名称通常都定 ...
- No assembly found containing an OwinStartupAttribute
自从在ASP.NET MVC中使用NuGet添加SignalR类库之后,再次运行程序时,它出现了一个异常: Server Error in '/' Application. The following ...
- iOS阶段学习第一天笔记(Mac终端的操作)
前言部分 原本从事的是.NET开发,一直在要不要转iOS 中犹豫徘徊,经过复杂的内心挣扎终于鼓起勇气辞职脱产学习iOS;希望通过四个月的 学习后能够拿到理想的薪资.以下是学习过程中的学习笔记,为了方便 ...
- 用node-webkit(NW.js)创建桌面程序
以往写windows桌面程序需要用MFC.C#之类的技术,那么如果你只会web开发技术呢?或者说你有一个网站,但是你想把你的网站打包成一个桌面应用程序,该如何做呢? 答案就是用node-webkit这 ...
- 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解
概述: ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...
- MongoDB学习-在.NET中的简单操作
1.新建MVC项目, 管理NuGet包,进入下载MongDB.net库文件 2.新增项目DAL数据访问层,引用以下库文件: 3.C# 访问MongoDB通用方法类: using MongoDB.Dri ...
- String和StringBuffer的区别
1.选自http://szh-java.iteye.com/blog/1666630 String 1,Stirng是对象不是基本数据类型 2,String是final类,不能被继承.是不可变对象,一 ...
- Java--Semaphore控制并发线程数量
package com; import java.util.concurrent.Semaphore; /** * Created by yangyu on 16/11/28. */ /** * Se ...