• ECMAScript的函数概述(一般定义到<head>标签之间)

(1)定义函数,JavaScript一般有三种定义函数方法:
*第一种是使用function语句定义函数(静态方法)

 function 函数名(var1,var2,...,varX)
{ 代码...(return) }

第二种是使用Function()构造函数来定义函数(不常用)

 var 函数名 = new Function(“参数1”,”参数2”,”参数3”……”函数体”);
如:
var 函数名 = new Function(”x”,”y”,”var z=x+y;return z;”);

*第三种是在表达式中定义函数

 var 函数名 = function(参数1,参数2,…){函数体};
//例如:
//定义
var add = function(a,b){
return a+b;
}
//调用函数
document.write(add(50,20));

(2)函数作用域:

函数外面定义的变量是全局变量,在整个HTML页面内都有效(生存期在整个HTML页面)。,函数内可以直接使用。在函数内部没有使用var定义的,变量则为全局变量,*在函数内使用var关键字定义的变量是局部变量,即出了函数外边无法获取。js函数定义的参数没有默认值。(目前只有最新的火狐浏览器支持)

(3)如何调用函数:

//sayHi函数
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); } //调用上面的函数 sayHi(),会生成一个警告窗口
sayHi("David", " Nice to meet you!")

(4)函数如何返回值:

函数 sayHi() 未返回值,即使函数确实有值,也不必明确地声明它。该函数只需要使用 return 运算符后跟要返回的值即可。

 function sum(iNum1, iNum2) {

   return iNum1 + iNum2;

 }

 //下面的代码把 sum 函数返回的值赋予一个变量:

 var iResult = sum(1,1);

 alert(iResult);    //输出 "2"

另一个重要概念是,与在 Java 中一样,函数在执行过 return 语句后立即停止代码。因此,return 语句后的代码都不会被执行。

 function sum(iNum1, iNum2) {

   return iNum1 + iNum2;
//alert 窗口就不会显示出来
alert(iNum1 + iNum2); }

一个函数中可以有多个 return 语句,如下所示:

 function diff(iNum1, iNum2) {

   if (iNum1 > iNum2) {

     return iNum1 - iNum2;

   } else {

     return iNum2 - iNum1;

   }

 }

上面的函数用于返回两个数的差。要实现这一点,必须用较大的数减去较小的数,因此用 if 语句决定执行哪个 return 语句。

如果函数无返回值,那么可以调用没有参数的 return 运算符,随时退出函数。

 function sayHi(sMessage) {
if (sMessage == "bye") { return; } alert(sMessage); }
//这段代码中,如果 sMessage 等于 "bye",就永远不显示警告框 //注释:如果函数无明确的返回值,或调用了没有参数的 return 语句,那么它真正返回的值是 undefined。
  • 关于函数的arguments对象

在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。

例如,在函数 sayHi() 中,第一个参数是 message。用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,第二个参数位于位置 1,依此类推)。

因此,无需明确命名参数,就可以重写函数:

 function sayHi() {
if (arguments[0] == "bye") {
return;
}
alert(arguments[0]);
}

1.检测参数个数

还可以用 arguments 对象检测函数的参数个数,引用属性 arguments.length 即可。下面的代码将输出每次调用函数使用的参数个数:

 function howManyArgs() {

 alert(arguments.length);

 }

 howManyArgs("string", 45);
howManyArgs();
howManyArgs(12); //上面这段代码将依次显示 "2"、"0" 和 "1"。
//与其他程序设计语言不同,ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 25 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略。

2.模拟函数重载

用 arguments 对象判断传递给函数的参数个数,即可模拟函数重载:

 function doAdd() {

   if(arguments.length == 1) {

     alert(arguments[0] + 5);

   } else if(arguments.length == 2) {

     alert(arguments[0] + arguments[1]);

   }
}
doAdd(10); //输出 "15" doAdd(40, 20); //输出 "60" //当只有一个参数时,doAdd() 函数给参数加 5。如果有两个参数,则会把两个参数相加,返回它们的和。所以,doAdd(10) 输出的是 "15",而 doAdd(40, 20) 输出的是 "60"。虽然不如重载那么好,不过已足以避开 ECMAScript 的这种限制。
  • Function对象(类)

1. Function对象的使用

函数实际上是功能完整的对象。Function 类可以表示开发者定义的任何函数。用 Function 类直接创建函数的语法如下:var function_name = new function(arg1, arg2, ..., argN, function_body)。

 <html>

 <head>

 <script type="text/javascript">

      var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");

 </script>

 </head>

 <body>

 <script type="text/javascript" >

      sayHi("Jackie","Welcome here!");//调用函数

 </script>

 </body>

 </html>

尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。

2. 使用Function类的length属性

 <html>

 <head>

 <script type="text/javascript">

      function fun1(){}

      function fun2(a1,a2){}

      function fun3(a1,a2,a3,a4,a5,a6,a7){}

 </script>

 </head>

 <body>

 <script type="text/javascript">

      document.write(fun1.length+" "+fun2.length+" "+fun3.length);

 </script>

 </body>

 </html>

使用Function的length属性可以得到函数的形参个数。

3. 使用Function类的valueOf()方法和toString()方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。

 <html>

 <head>

 function fun() {

   alert("Hi");

 }

 </head>

 <body>

 <script type="text/javascript">

      document.write(fun.toString());//输出函数的源代码

 </script>

 </body>

 </html>
  • 闭包

ECMAScript 最易让人误解的一点是,它支持闭包(closure)。闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。

1.简单的闭包实例

在 ECMAScript 中使用全局变量是一个简单的闭包实例。请思考下面这段代码:

 var sMessage = "hello world"; 

 function sayHelloWorld() {

  alert(sMessage);//使用函数之外定义的变量

  } 

 sayHelloWorld(); 

在上面这段代码中,脚本被载入内存后,并没有为函数 sayHelloWorld() 计算变量 sMessage 的值。该函数捕获 sMessage 的值只是为了以后的使用,也就是说,解释程序知道在调用该函数时要检查 sMessage 的值。sMessage 将在函数调用 sayHelloWorld() 时(最后一行)被赋值,显示消息 "hello world"。

2.复杂的闭包实例

在一个函数中定义另一个会使闭包变得更加复杂。例如:

 var iBaseNum = 10; 

 function addNum(iNum1, iNum2) {

     function doAdd() { 

           return iNum1 + iNum2 + iBaseNum; 

 9      } 

     return doAdd();

 } 

这里,函数 addNum() 包括函数 doAdd() (闭包)。内部函数是一个闭包,因为它将获取外部函数的参数 iNum1 和 iNum2 以及全局变量 iBaseNum 的值。 addNum() 的最后一步调用了 doAdd(),把两个参数和全局变量相加,并返回它们的和。

这里要掌握的重要概念是,doAdd() 函数根本不接受参数,它使用的值是从执行环境中获取的。可以看到,闭包是 ECMAScript 中非常强大多用的一部分,可用于执行复杂的计算。

提示:就像使用任何高级函数一样,使用闭包要小心,因为它们可能会变得非常复杂。

  • JavaScript函数的思维导图

JavaScript基础5——关于ECMAscript的函数的更多相关文章

  1. javascript基础一语法和常用函数

    1语法 1.1引入的方式 在html中引入javascript,使用script标签,在html页面中包括外部引入js方式和在html内部引入js方式.如下两种: 方式一: <script ty ...

  2. JavaScript基础11——js的全局函数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. JavaScript基础知识(对象、函数与对象)

    17.对象 属性:描述对象的信息  方法:描述对象的行为  封装:只关心输入和输出(不管过程如何实现) ü 对象的分类: 内置对象(原生对象): 就是JavaScript语言预定义的对象(如Strin ...

  4. JavaScript基础笔记(五) 函数表达式

    函数表达式 一.闭包 概念:闭包是指有权访问另一个函数作用域中变量的函数. function createCompareFun(propertyName) { return function (obj ...

  5. JavaScript | 基础(变量/引用/转换/函数)

    ———————————————————————————————————————————— 变量 全局变量:在函数体外声明,全局可以使用 局部变量:通过关键字var来声明 变量类型 <script ...

  6. JavaScript基础-自己定义自己的函数(016)

    把一个函数对象赋值给变量后,就可以通过这个变量再次定义函数,甚至可以在一个函数内部再次定义它自己: var scareMe = function () { alert("Boo!" ...

  7. JavaScript基础(1)-ECMAScript

    一.JavaScript简介 1.JavaScript历史背景 布兰登 • 艾奇(Brendan Eich,1961年-),1995年在网景公司,发明的JavaScript. 刚开始JavaScrip ...

  8. 【javascript基础】2、函数

    前言 我在上一篇[javascript基础]基本概念中介绍了javascript的一些基本概念,多谢大家的阅读和意见,自己写的东西可以被大家阅读,真心高兴,刚开始发布的时候我一直盯着阅读人数,虽然知道 ...

  9. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

随机推荐

  1. python 小白(无编程基础,无计算机基础)的开发之路 day2

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  2. js 资料

    http://javascript.ruanyifeng.com/#introduction 2.MDN 火狐中文社区  https://developer.mozilla.org/zh-CN/doc ...

  3. Docker技术浅谈:私有化部署的优势以及在顶象内部的应用实践

    顶象全景式业务安全风控体系基于新一代风控体系构建,并采用Docker技术进行私有云和公有云部署.本文主要和大家分享下Docker容器技术和顶象风控系统私有化部署的优势以及Docker容器技术在顶象内部 ...

  4. 支持多用户web终端实现及安全保障(nodejs)

    背景 笔者近期从事在线IDE工作的开发,作为本地IDE普遍拥有的功能,terminal(命令行)对项目的git操作以及文件操作有着非常强大的支持.而之前没有web伪终端的情况下,仅仅提供已封装好的gi ...

  5. 本地git部署web连接azure的git存储库

    ​​​本地git部署web 创建本地存储仓库 输入以下命令创建git本地仓库(会在当前目录下生产一个.git的目录) git init 然后提交内容 在git仓库所在的目录下存放好需要的网页文件 将文 ...

  6. jquery 三级关联选择效果

    在网页制作中,三级关联选择经常遇到,于是归纳了一个进行参考 代码如下: <!DOCTYPE html> <html lang="en"> <head& ...

  7. python爬虫实战 获取豆瓣排名前250的电影信息--基于正则表达式

    一.项目目标 爬取豆瓣TOP250电影的评分.评价人数.短评等信息,并在其保存在txt文件中,html解析方式基于正则表达式 二.确定页面内容 爬虫地址:https://movie.douban.co ...

  8. HDU 2686 Matrix 多线程dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 思路:多线程dp,参考51Nod 1084:http://www.51nod.com/onlin ...

  9. mysql复习秘籍

    mysql复习 一:复习前的准备 1:确认你已安装wamp 2:确认你已安装ecshop,并且ecshop的数据库名为shop 二 基础知识: 1.数据库的连接 mysql -u -p -h -u 用 ...

  10. 欢迎大家关注我的微信公众号(nangongkuo)

    欢迎大家关注我的微信公众号,在这个公众号里面我会给大家分享我学习过程中分享给大家的一些技术性的东西,和一些生活经验的总结分享.