JavaScript⑤函数
栏目: JavaScript · 发布时间: 7年前
内容简介:JavaScript⑤函数
ECMAScript中的函数使用 function 关键字来声明,后跟一组参数以及函数体。
// 基本的语法 function functionName(argument1,argument2){ /*一堆的代码*/ } //下面是函数的一个实例, function diff(a,b){ console.log(a-b); } diff(10,5);//输出5 diff(20,2);//输出18
函数还有一个属性,就是可以return;ECMAScript中函数在定义的时候,不要求函数是否返回一个值,但是每个函数都有return的权利;任何函数在任何时候都可以通过return语句返回的值来实现把值返回给外部变量。
function diff(a,b){ return a-b; } var diffNumber=diff(10,5); console.log(diffNumber);
函数的返回值只能通过return来返回,除了return以外,没有任何声明可以表示返回值,无论return在哪里,只要有执行了return同一条的代码后,函数立即停止,并且立即退出,因此位于return语句之后的人和代码都永远不会执行;
return语句可以不带任何返回值,这种情况下,函数返回值是undefined;这种写法,一般用在需要提前停止函数又不需要返回值的情况下。
函数的定义
- function语句的定义方法
- 函数直接量的定义方法
- 构造函数的定义方法
//function语句的定义方法 function test1(arg1,arg2){ console.log("function语句的定义方法:",arg1+arg2); return; } //函数直接量的定义方法 var test2 = function(arg1,arg2){ console.log("函数直接量的定义方法:",arg1+arg2); return; } //构造函数的定义方法 var test3 = new Function("arg1","arg2","console.log('构造函数的定义方法:',arg1+arg2)");
函数的重载
ECMAScript 函数不能实现重载,ECMAScript 没有函数签名,因为其参数是由包含0 或者多个值的数组来表示的。如果在 ECMAScript 中定义了两个名字相同的参数,则该名字只属于后定义的函数。
function add(num){ return num + 100; } function add(num){ return num + 200; } var ret = add(100); console.log(ret); //300
函数的调用
直接调用:函数名(实参列表)
function test1(arg1,arg2){ console.log("function语句的定义方法:",arg1+arg2); return; } //直接调用 test1(1,2);//function语句的定义方法: 3
在链接中调用
<body> <buttontype="button"name="button"onclick="test1(9,9)">click me</button> <script> function test1(arg1,arg2){ console.log("function语句的定义方法:",arg1+arg2); return; } </script> </body>
在事件中调用
<body> <buttontype="button"name="button"id="btn1">click me</button> <script> var oBtn1=document.getElementById("btn1"); oBtn1.onclick=function(){ test1(2,2) }; function test1(arg1,arg2){ console.log("function语句的定义方法:",arg1+arg2); return; } </script> </body>
递归调用
在函数内部调用函数自身
<buttontype="button"name="button"id="btn1">click me</button> <script> var oBtn1=document.getElementById("btn1"); oBtn1.onclick=function(){ test1(10,1); }; function test1(arg1,arg2){ console.log("最开始的调用方法",arg1+arg2); arg1--; if(arg1>0){ test1(arg1,arg2) } return; } </script>
arguments对象
功能
存放实参的参数列表
test1(1,2);//[1,2] test1(1,2,3,4,5);//[1, 2, 3, 4, 5] function test1(){ console.log(arguments); } //{ '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
argutments 在普通模式里,可以在函数内部修改函数的值;在严格模式下,函数内部不能修改argument的值,即使修改了,操作也是无效的;其次重写arguments值会导致语法错误,代码不执行;
特性
仅能在函数体内使用
test1(1,2);//[1,2] function test1(){ console.log(arguments); } console.log(arguments);//arguments is not defined
函数声明时自动初始化
属性
length:获取函数实参的长度
test1(1,2,3,4,5);// 输出5 function test1(){ console.log(arguments.length); }
this关键字的指向
- this:指向当前操作对象;
- callee:指向正在执行函数的指针;
函数表达式
匿名函数
创建一个函数并把它赋值给变量,这种情况下创建的函数叫做 匿名函数 。
var sayHi; sayHi = function(num){ console.log("sayHi " + num); } sayHi(1); //sayHi 1
//创建一个匿名函数并立即执行 var ret = (function(x,y){ return x * y; })(3,8); console.log(ret); //24
函数闭包
闭包是指有权访问另一个 函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
function lazy_sum(arr){ var sum = function(){ return arr.reduce(function(x,y){ return x * y; }); } return sum; } var f = lazy_sum([1,2,3,4,5]); //返回的是求和函数 console.log(f()); //调用函数f计算求和
借助闭包,可以封装一个私有变量
//闭包实现计数器 function create_counter(initial){ var x = initial || 0; return { inc: function(){ x += 1; return x; } } } var counter1 = create_counter(); console.log(counter1.inc()); //1 console.log(counter1.inc()); //2 console.log(counter1.inc()); //3 var counter2 = create_counter(10); console.log(counter2.inc()); //11 console.log(counter2.inc()); //12 console.log(counter2.inc()); //13
闭包还可以把多参数的函数变成单参数的函数。
function make_pow(n){ return function(x){ return Math.pow(n,x); } } //创建两个新函数 var pow1 = make_pow(2); var pow2 = make_pow(3); console.log(pow1(2)); // 4 console.log(pow2(2)); // 8
箭头函数
ES6标准新增了一种新的函数:Arrow Function(箭头函数)。
x => x * x
上面的箭头函数相当于
function (x) { return x * x; }
使用
'use strict'; var fn = x=> x * x; console.log("箭头函数 "+ fn(3));
高阶函数
JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。一个最简单的高阶函数:
function addHigh(x, y, f){ return f(x) + f(y); } console.log(addHigh(-4,-5,Math.abs)); //9
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Python 拓展之特殊函数(lambda 函数,map 函数,filter 函数,reduce 函数)
- Python 函数调用&定义函数&函数参数
- python基础教程:函数,函数,函数,重要的事说三遍
- C++函数中那些不可以被声明为虚函数的函数
- 017.Python函数匿名函数
- 纯函数:函数式编程入门
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
TCP/IP详解 卷1:协议
W.Richard Stevens / 范建华 / 机械工业出版社 / 2000-4-1 / 45.00元
《TCP/IP详解卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者W.Richard Stevens用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。 《TCP/IP详解卷1:协议》适合作为计算机专业学......一起来看看 《TCP/IP详解 卷1:协议》 这本书的介绍吧!