JavaScript学习整理(二)

一 函数
1.参数的设置
(1)无参函数:无参函数适用于不需要提供任何数据,即可完成指定功能的情况

function greet(){
console.log('Hello everybody!');
}

需要注意的是,在自定义函数时,即使函数的功能实现不需要设置参数,小括号“()”也不能够省略

(2)有参函数:若函数体内的操作需要用户传递的数据,此时函数定义时需要设置形参,用于接收用户调用函数时传递的实参:

function maxNum(a,b){
a = parseInt(a);
b = parseInt(b);
return a >= b ? a : b
}

(3)获取函数调用时传递的所有实参:若在开发时不能确定函数的形参个数,此时定义函数时可以不设置形参,在函数体中直接通过arguments对象获取函数调用时传递的实参,实参的总数可通过length属性获得

function transferParam(){
console.log(arguments.length);
console.log(arguments);
}

2.函数的调用
调用函数只需要引用函数名,并传入相应的参数即可

<script>
function getSum(){        //定义函数
var sum=0;                   //保存函数和
for(i in arguments){      //遍历参数,并累加
sum += arguments[i];  
}
return sum;                  //返回函数处理结果
}
console.log(getSum(10,20,30));//函数调用
</script>

3.变量的作用域
声明变量后并不意味着就可以在任意位置使用该变量
(1)全局变量:不存在任何函数内声明的变量(显示定义)或在函数内省略var声明的变量都称为全局变量,它在同一个页面文件中的所有脚本内都可以使用
(2)局部变量:在函数体内利用var关键字定义的变量成为块级变量,它仅在该函数体内有效
(3)块级变量:ES6提供的let关键字声明的变量成为块级变量,它仅在“{}”中间有效,如if、for或while语句等

4.匿名函数
(1)函数表达式

var fn=function sum(num1,num2){                      //定义函数表达式
return num1+num2;                       
};
fn()                                                 //调用函数

(2)匿名函数:匿名函数是指没有函数名称的函数,可以有效的避免全局变量的污染以及函数名的冲突,它既是函数表达式的另一种表达形式,又可以通过函数声明的方式实现调用。

//方法一:函数表达式中省略函数名
var fn=function(num1,num2){
return num1+num2;
};
fn(1,2);
//方法二:自调用方式
(function(num1,num2)){
return num1+num2;
}(2,3);
//方法三:处理事件
documnet.body.onclick=function(){
alert('Hi,everybody');
};

箭头函数:ES6中引入了一种新的语法编写匿名函数,称之为箭头函数。其中,一个箭头函数表达式的语法比一个函数表达式更短。

//用法1:标准语法
(p1,p2, ..., pN) => {statments}
//用法2:返回值
(p1,p2 ...,pN) => {return expression;} 或 (p1,p2, ...pN) => expression
//用法3:含有一个参数
(singleParem) =>{statmanes;} 或 singlePeram => {statments;}
//用法4:无参箭头函数
() =>{statments;} 或 _ => {statments;}

上述语法中,箭头“=>”前的小括号式是传递的参数,后面的{}中的是函数体,当函数体中只有一条语句时可以省略{}同时函数体中只有一条返回值语句时可同时省略{}和return关键字。当参数列表中只有一个参数时可以省略(),当箭头函数没有参数时,箭头"=>"前必须含有小括号或下划线

//设置1个参数
var fn1 = x => x+2;
console.log(fn1(4));
//设置2个参数
var fn2=(x,y) =>x+y;
console.log(fn2(1,2));

(3)回调函数

方法名 功能描述
find() 返回数组中满足回调函数的第一个元素的值,否则返回underfined
every() 测试数组的所有元素是否通过了回调函数的测试
some() 测试数组中某些元素是否通过由回调函数实现的测试
forEach() 对数组的每个元素执行一次提供的函数
map() 创建一个新数组,其结果是该数组中的每个元素都调用一次提供的回调函数后返回结果
reduce() 对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值
reduceRight() 接收一个函数作为累加器和数组的每个值(从右到左)将其减少为单个值
实例代码:
<script>
function cal(num1,num2,fn){
return fn(num1,num2);
}
console.log(cal(45,55,function(a,b){
return a+b;
}));
console.log(cal(10,20,function(a,b){
return a*b;
}));
</script>

2到4行定义cal()函数,用于返回fn回调函数的调用结果。5~7行用于调用cal()函数,并指定该回调函数用于返回两个参数相加的结果,同理,8到10行调用cal()函数指定回调函数用于返回两个参数相乘的结果

5.嵌套与递归
(1)函数嵌套与作用域链:对与嵌套函数而言,内层函数只能在外层函数作用域内执行,在内曾函数执行过程中。若需要引入某个变量。首先辉在当前作用域中寻找,若未找到,则继续向上一层的作用域中寻找直到全局作用域。

<script>
var i=26;
function fn1(){
var i=24;
function fn2(){
function fn3(){
console.log(i);
}
fn3();
}
fn2();
}
fn1();
</script>

(2)递归调用:它指的是一个函数在其函数体内调用自己的过程,递归只有在计算阶乘等特殊情况下使用;

<script>
function factorial(n){
if(n==1){
return 1;
}
return n * factorial(n-1);
}
var n=prompt('求n的阶乘\n n是大于等于1的正整数,如2表示求2!。');
n=parseInt(n);
if(isNaN(n)){
console.log('输入的n不合法')
}else{
console.log(n+'的阶乘为:' + factorial(n));
}
</script>

6.闭包函数
闭包函数可以在函数外部读取函数内部的变量。
可以让变量的值始终保持在内存中
闭包函数的实现:

<script>
function fn(){
var times=0;
var c=function(){
return ++times;
};
return c;
}
var count =fn();       //保存fn()返回的函数,此时count就是一个闭包
//访问测试
console.log(count());
console.log(count());
console.log(count());
console.log(count());
console.log(count());
</script>

上述代码4到6行利用闭包函数实现了在全局作用域中访问局部变量times,并让变量的值始终存储在内存中,第九行调用fn()函数后,将匿名函数的引用返回给count变量,且使用了局部变量times所以times不会在fn()函数执行完后被回收。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值