/**
* 1.函数定义
* 函数定义最常用的方法是调用function语句。该语句由关键词function构成,紧随其后跟的是函数名(可选)、参数列表(使用括号括起来,括号必选,列表可选,参数使用逗号分割开来)、函数体(大括号括起来,大括号必选,内容可选)。
*/
//函数可以有返回值,使用return 语句;也可以没有返回值
function test_return(){
return window.alert("test_call");
}

/**
* 2.使用Function()构造函数和new定义函数。
* 下面的定义等价于 function f(x, y){return x*y;}
* Function构造函数可以接受任意多个字符串参数。它的最后一个参数是函数的主体,其中可以包含任何javascript语句,语句之间使用分号分割,其他的参数都是说明函数的参数的。
* 注意:传递给构造函数Function()的参数中没有一个用来说明函数名的,所以也成“匿名函数”。
*/
var f = new Function("x", "y", "return x*y");

/**
* 3.使用函数直接量定义函数
* 函数直接量是一个表达式,它可以定义匿名函数,结尾有分号。函数直接量的语法和function语句非常相似,只不过他被用作表达式,而不是语句,而且也无需制定函数名。
* 函数直接量表达式指定的函数可以存储在一个变量中,可以传递给其他的函数甚至被直接调用。
*/
function f1(x, y){return x*y;} //使用function语句定义
var f2 = new Function("x", "y", "return x*y;"); //使用Function和new定义
var f3 = function(x, y){return x*y;}; //使用函数直接量定义,赋值给变量f3

a[0] = function(x){return x*x;} //定义一个函数并保存它
a.sort(function(a, b){return a-b;}); //定义一个函数,把它传递给另一个函数
var tensquared = (function(x){return x*x;})(10); //定义一个函数并调用它,把结果赋值给一个变量

/**
* 4.作为数据的函数
* 函数可以被赋值给变量、存储在对象的属性中或存储在数组的元素中、传递给函数等等。
* 下面创建了一个函数对象,并把这个对象赋值给了变量square。实际上,函数名并没有什么实质意义,它不过是用来存放函数的变量的名字。
*/
function square(x){return x*x;}

/**
* 函数作为数据的例子
*/

//我们定义了四个简单的函数
function add(x, y){return x+y;}
function substract(x, y){return x-y;}
function multiply(x, y){return x*y;}
function divide(x, y){return x/y;}
//下面这个函数使用上面某个函数作为参数,同时传入两个参数,返回运算结果
function operate(ope1, ope2, ope){
return ope(ope1, ope2);
}
//可以使用上面的函数计算(2+3)-(4*5)
var i = operate(operate(add, 2, 3), operate(multiply, 4, 5), substract);

//下面把函数保存到数组中,使用函数直接量形式定义
var opes = new Object();
opes['add'] = function(x, y){return x+y;};
opes['substract'] = function(x, y){return x-y;};
opes['multiply'] = function(x, y){return x*y;};
opes['divide'] = function(x, y){return x/y;};
opes['pow'] = Math.pow;

//以下的函数将运算符作为参数,在数组中检索这个运算符,然后对运算符调用检索到的函数。注意调用这个运算符函数的语法。
function operate2(ope1, ope2, opt_name){
if(opes[opt_name]==null)return "unknown operator";
else return opes[opt_name](ope1, ope2);
}

//下面计算("hello" + " " + "world");
var j = operate2("hello", operate2(" ", "world", "add"), "add");

/**
* 5.arguments标识符
* javascript函数的主体实在局部作用域中执行的,该作用域不同于全局作用域。这个新作用域是通过把调用对象添加到作用域链的头部
* 创建的。因为调用对象是作用域链的一部分,所有在函数体内可以把这个对象属性作为变量来访问。用var语句声明的局部变量创建后作为调用对象的属性,而且函数的形式参数也可用于对象的属性。
* 除了局部变量和形式参数外,调用对象还定义了一个特殊属性,名为arguments。这个属性引用了另外一个特殊的对象——Arguments对象。该对象属于函数调用环境。
* 在一个函数体内,标识符arguments具有特殊含义。它是调用对象的一个特殊属性,用来引用Arguments对象。Arguments对象就像数组,可以按照数字获取传递给函数的参数值。
* 但是它并非真正的Array对象。Arguments对象也定义了callee属性。
*
* 尽管定义函数时有固顶数目的命名参数,但是当调用这个函数时,传递给它的参数数目却可以是任意的。arguments属性支持[]运算符。
* 注意:中括号里面是索引值,从0开始。arguments[]可以完全地存取那些实际参数值,即使某些参数没有被定义。如arguments[0]表示第一个形式参数的值。
*
* 使用arguments[]可以帮助我们编写能够接受任意数目实际参数的函数。
*
* arguments[]不是数组,它表示的是Arguments对象。Arguments对象有一个非同寻常的特性。当函数定义了形式参数时,arguments[]里面存放的元素就是形式参数的值。arguments[]和形式参数不过是引用同一变量的两种不同方法。
* 通过任何一种方式改变值都会影响两一种方式的值。
*
* 下面定义了一个匿名函数(第一个括号内的函数),函数体首先输出参数值,然后赋值null,再次输出参数值。定义函数后调用它,同时传递给它一个实际参数5.
*/
(function(x){window.alert(x); x=null; window.alert(x);})(5); //第一次输出是5,第二次输出是null

/**
* 6.callee属性
* Arguments对象除了有arguments属性,还有callee属性,用来引用当前正在执行的函数。这对匿名函数调用自身非常有用。
* 下面是一个计算阶乘的匿名函数.
*/
var v = function(x){if(x<=1)return 1; else return x*arguments.callee(x-1);}
window.alert(v(5));

/**
* 7.Function函数对象
* 函数是一种javascript对象,就行String对象和Date对象一样。同样具有属性和方法。
* Function对象具有length,这是个只读属性,该属性确切地说明了一个函数声明的形式参数的个数。不同于arguments的属性,arguments.length表示函数实际接收到的参数个数。
* 下面的check函数会检测函数接收到的实际参数个数和定义的参数个数是否相等,不等的话抛出错误。f函数应用了check函数。最后输出应该报错。
* 另外,Function对象还有一个prototype属性,表示预定义的原型对象。原型对象在使用new运算符把函数作为构造函数时起作用。它在定义新的对象类型时起着非常重要的作用。
*/
function check(args){
var actual = args.length;
var expected = args.callee.length;
if(actual != expected){
throw new Error("Wrong number of arguments: expected:"+expected+" ;but actually passed "+actual);
}
}

function f(x, y, z){
check(arguments);
return x+y+z;
}

window.alert(f(2,5));

/**
* 8.Function对象的apply方法和call方法
* 所有函数都有这两个方法。使用这两个方法就像用其他对象的方法医用。call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值。call()的剩余参数是传递给要调用的函数的参数。
*/
var o = new Object();
function f(x, y){return x+y;}
o.m = f;
window.alert(o.m(2,5)); //以上两行代码等价于f.call(o,2,5);

//apply()方法的参数和call()方法类似,只是传递给函数的参数时候数组指定的。如上面可以写成f.apply(o,[2,5]);

function介绍相关推荐

  1. C++11: std::function<void()> func

    std::function介绍 类模版std::function是一种通用.多态的函数封装.std::function的实例可以对任何可以调用的目标实体进行存储.复制.和调用操作,这些目标实体包括普通 ...

  2. C++11中的std::function

    文章转载自:http://www.jellythink.com/archives/771 看看这段代码 先来看看下面这两行代码: std::function<void(EventKeyboard ...

  3. C++11 std::function, std::bind, std::ref, std::cref

    C++11 std::function, std::bind, std::ref, std::cref 转自:http://www.jellythink.com/ std::function 看看这段 ...

  4. C++11新特性之std::function<>

    转自http://www.jellythink.com/archives/771 看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Eve ...

  5. 函数对象,lamdda表达式,function函数包装,std::bind函数绑定

    一 函数对象 在学习其他知识之前,先来学习函数对象,然后引出std::lambda.std::function.std::bind等内容的学习,那么究竟什么是函数对象呢? 函数对象(Function ...

  6. 距离 Java 开发者玩转 Serverless,到底还有多远?

    本文摘自 Spring Cloud Alibaba 开源项目创始团队成员方剑撰写的 <深入理解 Spring Cloud 与实战> 一书,主要讲述了 Java 微服务框架 Spring B ...

  7. c++高级编程学习笔记5

    multimap multimap 是一种允许多个元素使用同一个键的 map.和 map 一样,multimap 支持统一初始化.multimap的接口和 map 的接口几乎相同,区别在于multim ...

  8. Effective C++ 中文版(第三版)读书笔记 更新ing~

    Effective C++ 中文版(第三版)持续更新ing 让自己习惯C++ 条款1 视c++为一个联邦 条款2 尽量以const,enum,inline替换#define 条款3 尽可能使用cons ...

  9. WebGoat-8.2.2版靶机学习总结

    摘要:本文档介绍了WebGoat靶机平台在Windows10系统下的使用.其操作过程均在一台主机上完成.该平台涉及的训练项目有http代理.数据库注入.身份校验缺陷.XSS.访问控制缺陷.通信拦截.序 ...

最新文章

  1. 【摘自】人民日款网友感悟
  2. 【转载】xmind的使用安装方法
  3. JavaScript常用判断函数 [转]
  4. Windows内核系统调用分析
  5. addr2line探秘(没有core怎么办)
  6. aspose 生成word 简单的文档操作
  7. kubernetes--配置文件
  8. 正则表达式验证账号代码
  9. Servlet的Cookie和Session机制
  10. mysql清除旧版本_MYSQL使用INNODB时及时清理旧版本数据
  11. ubuntu自动加载硬盘分区
  12. MySql数据库增删改查常用语句命令-MySQL数据库入门到精通
  13. (精华2020年5月12日更新) vue实战篇 axio.js封装和环境配置
  14. sqlserver中65535_Sql Server数据导出EXCEL 解决行数超过65535问题
  15. 华硕固件 mysql_刷华硕固件后的桥接中继教程
  16. python 知乎 合并 pdf_怎么把多个pdf合并在一起?
  17. 设计一个用户注册页面,对用户输入的内容进行有效性验证,如用户名和密码不能为空,两次输入的密码必须相同,邮箱地址必须包含“@”符号等。
  18. Matlab 查阅、读取nc数据
  19. ISCC部分pwn题解
  20. 数字与英文字母转换matlab,MATLAB编程:数值(0-25)转换成大写英文字母

热门文章

  1. html2canvas解决图片空白,网络图片跨域
  2. 腾讯重磅开源 DCache,分布式 NoSQL 存储系统
  3. RabbitMQ的Qos
  4. USB转串口驱动代码分析
  5. (2012.12.25)我的中级软件设计师考试
  6. 大数据分析,到底分析了啥?
  7. windows store下载_年度付费软件排行榜这10款软件,你用过5款以上,就算效率达人!Windows平台...
  8. 《趣弹幕-滚动LED显示屏-隐私协议》
  9. Latex texstudio+ctex中文解决方案
  10. cod16与战网服务器连接中断,《使命召唤16》无法连接服务器怎么解决 服务器连接解决攻略...