js-函数-学习笔记

1、函数的概念,声明,调用

1.1、JS中的函数:把一段需要重复使用的代码,用function语法包起来,方便重复调用,分块和简化代码
1.2、声明+调用:
方法一:利用函数关键字声明函数

语法:
function 函数名(形参){
//函数体
}
函数名(实参);//调用函数

方法二:利用函数表达式来声明函数(匿名函数)

var 变量名 = function(形参){
}
变量名(实参);//调用是变量名加括号 调用必须写到表达式的下面


//变量名不是函数名

函数调用:

1、函数名(); 变量名();
2、document.onclick = 函数名; //在事件中调用函数

注意点:

  1. function 是声明函数的关键字 全部小写
  2. 函数名是动词
  3. 如果函数不调用 自己是不执行的
  4. 函数表达式也可以传递参数

2、函数的参数和返回值

我们可以利用函数的参数实现函数重复不同的代码
函数的参数可以多个也可以不要

function 函数名(形参1,形参2){
//函数执行代码
}
func(实参1,实参2);//调用时传参

形参是接受实参的,相当于一个不用声明变量

2.1:当形参和实参不匹配的情况

  • 实参的个数大于形参的个数
    会取到形参的个数,实参后面多出来的就不要了
  • 实参的个数小于形参的个数
    结果都是NaN

2.2:返回值

function 函数名(){
return 需要返回的结果;
}
函数名();

注意点:

  1. 只要函数遇到return 就把return后面的结果 返回给函数的调用者 也就是说:函数名()=return后面的结果
  2. return终结函数:当代码执行到return时,其后面的代码就不会执行了,不仅可以退出循环,还能够返回return中的值,同时还可以结束当前函数体内的代码
  3. 如果没有return则返回的是undefined
  4. return只能返回一个值。如果用逗号隔开多个值,以最后一个为准. 如果需要返回多个值,就用数组的写法,返回的是数组的形式
    return[ num,num1,num2];

3、arguments

arguments 是用来获取参数的,arguments对象中存储的是传递的所有实参 是函数内置好的对象,直接拿来用。是一个伪数组

这里给大家讲解哈什么事伪数组

1、具有数组的length的属性;
2、按照索引的方式进行存储的;
3、它没有真正数组的一些方法:pop()、push()。。

举例:可以看出arguments里面存放的是一组实参

     function a() {
            console.log(arguments);
        }
        a(1,2,3);

在这里插入图片描述
一般可以按照数组的方法遍历arguments

在这里插入图片描述

4、作用域和预解析

预解析常常是面试会问的问题

4.1:作用域

概念:就是代码名字在某个范围内起作用和效果。
目的:是为了提高程序可靠性,减少命名冲突

局部作用域,也叫做函数作用域,这个代码在函数内部起作用;
局部作用域 , 整个script标签 或者是一个单独的js文件

变量作用域根据作用域划分为:全局变量、局部变量 没有块级作用域

全局变量

全部变量只有浏览器关闭的时候才会销毁,比较占用内存
特殊情况:
如果在函数内部没有声明直接赋值的变量也是全局变量
比如:var a = b = c =9;
相当于var a=9;
           b=9;
           c=9; 则b和c是全局变量

局部变量

局部变量在函数内部使用,当函数结束就会被销毁,更节省内存空间
函数的形参也可以当作局部变量

作用域链:内部函数访问外部函数的变量 利用链式查找变量 (就近原则

4.1:预解析

之前我们提到js有一个解释器来解释并执行我们的代码,这个解释器就是 预解析加代码执行
预解析定义:js引擎会把js里面所有的var还有function提至到当前作用域的前面,变量提升只是将我们的变量声明提升 值不提升
代码执行:按照代码书写的顺讯从上往下执行

  • var在预解析时,会把声明提升到最前边(赋值前打印返回undefined)。只提升声明,不会把赋值过程进行提升。
  • function的函数体在预解析时,会把整个函数体提升至最前边。(函数体:function fn(){ console.log(1);})
  • 函数表达式(函数表达式:var fn = function(){};)只会提升函数表达式的声明,不会执行(真正执行函数表达式前调用会返回undefined)
  • 在预解析时,会先预解析var(包括变量声明和函数表达式的变量声明),把var放在最前面,然后再预解析function,所以当var和function重名时,function会覆盖var;

/*
解析过程:先预解析var声明的a,再预解析函数体a,后面覆盖前面,所以最后结果是function函数体
var a;
function a(){console.log(“函数a”);};//此函数体解析后会覆盖变量a
*/
console.log(a);
var a = 0;
function a(){
console.log(“函数a”);
}

`

     //原代码
        var num = 1;
        function demo() {
            console.log(num);
            function demoSon() {
                num = 3;
            }
            var num = 2
            demoSon();
        }
        demo(); //结果是 undefined
    /* 预解析后
         var num;
         function demo() {
            var num ;
            function demoSon() {
                num = 3;
             } 
           console.log(num);
             num = 2;
             demoSon();
           
         }
         num = 1;
         demo();*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶茶丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值