JS “函数、作用域、预解析 ”笔记

 2022年7月7日周四,学习记录博客。今日学习进度:函数、作用域、预解析。学习时长:5h。

目录

函数

1.函数的概念

2.函数的使用

3.函数的参数

4.函数的返回值

5. arguments 的使用

6.案例

7.函数的两种声明方式

JS的作用域

1.作用域

2.变量的作用域

预解析

1.预解析概念

2. 变量预解析和函数预解析

3.预解析案例

 


函数

复习target

  • 为什么需要函数
  • 函数的书写语法
  • 如何根据需求 封装函数
  • 说出 形参和实参的传递过程
  • 如何使用函数的返回值
  • 如何使用 arguments获取函数的参数

目录

1.函数的概念

2.函数的使用

3.函数的参数

4.函数的返回值

5. arguments 的使用

6.案例

7.函数的两种声明方式

1.函数的概念

函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。

2.函数的使用

函数在使用时分为两步:声明函数 调用函数。

2.1 声明函数

  • function 是声明函数的关键字,必须小写。
  • 由于函数一般是为了实现某个功能才定义的,所以通常我们将函数命名为动词,例如 getSum。

2.2 调用函数

  • 调用是不能 忘记小括号
  • 调用口诀:函数不调用,自己不执行。
    //声明函数
    function 函数名(){
        //函数体 代码
    }
    //调用函数
    函数名();

2.3 函数的封装

函数的封装是把一个或者多个功能通过 函数的方式封装起来,对外值提供一个简单的函数接口。

3.函数的参数

3.1 形参和实参

声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参。而在调用该函数时,同样也需要传递相应的参数,这些参数被称为实参

参数的作用:在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去。

3.2 函数形参和实参个数不匹配

function sum(num1 + num2){
    console.log(num1 + num2);
}
sum(100 + 200);        //形参和实参个数相等,输出正确结果300
sum(100 + 200 +300);   //实参个数多余形参,只取到形参的个数。结果为300
sum(100);              //实参个数小于形参,num2赋值为 undefined,结果为NaN

4.函数的返回值

4.1 return 语句

使用return语句来返回函数的值。

//return 语句用法
例如 求任意两个数的和
function getSum(num1,num2){
    return num1 + num2;
}
console.log(getSum(1,2));

案例:利用函数 求两个数的最大值
function getMax(num1,num2){
    return num1 > num2 ? num1 : num2;
}
console.log(getMax());

4.2 return 终止函数

在一个函数体中,return 语句后面的代码不会被执行。

4.3 return 的返回值

return 只能返回一个值。如果用逗号隔开多个值,以最后一个为准。

如果需要返回多个值,可以使用 数组。

示例:求任意两个数的 加减乘除结果
function getResult(num1,num2){
    return [num1 + num2, num1 - num2, num1 * num2, num1 / num2];
}
var re = getResult(1,2);
console.log(re);

4.4 函数没有 return 返回 undefined

函数都是有返回值的

  • 如果有 return 则返回 return 后面的值
  • 如果没有 return 则返回 undefined

4.5 break,continue,return 的区别

  • break : 结束当前的循环体(如 for,while)
  • continue:跳出本次循环,继续执行下次循环(如 for、while)
  • return:不仅可以退出循环,还能够返回 return语句中的值,同时还可以结束当前的函数体内的代码。

5. arguments 的使用

当我们不确定有多少个参数传递的时候,可以用arguments 来获取。在JS中,arguments实际上是当前函数的一个内置对象。所有函数都内置了一个 arguments对象,arguments 对象中存储了传递的所有实参。

(仅有函数有 arguments 对象)

arguments 展示形式是一个伪数组,因此可以进行遍历。伪数组具有以下特点:

  • 具有 length 属性
  • 按索引方式储存数据
  • 不具有数组的 push、pop 等方法
    /示例:利用函数求 任意个数 的最大值
    function getMax(){
        var max = arguments[0];
        for(var i = 0;i < arguments.length;i++){
            if(arguments[i] > max){
                max = arguments[i];        
            }    
        }
        return max;
    }
    console.log(getMax(1,2,3,4,5));
    console.log(getMax(5,8,10,66,20,30,10));

6.案例

在函数中可以调用另一个函数

1.利用函数判断是否闰年

2.用户输入年份,输出当前年份的2月份天数

//1.利用函数判断是否闰年
function isRunYear(year){
    var flag = false;
    if(year % 4 == 0 && year % 100 != 0 || year % 400 ==0){
        flag = true;    
    }
    return flag;
}
console.log(isRunYear(2000));
//2.用户输入年份,输出当前年份的2月份天数
function backDay(){
    var year = prompt('请您输入年份:');
    if(isRunYear(year)){
        alert('当前年份是闰年2月份有29天');    
    } esle{
      alert('当前年份是平年2月份有28天');      
    }
}
backDay(); // 此处不能写 实参

7.函数的两种声明方式

1、利用函数关键字声明函数(命名函数)

2、利用函数表达式(匿名函数)

函数表达式中,没有函数名,只有变量名。

// 函数关键字声明
function fn(){
    console.log('我是函数关键字声明');
}
var fun = function(aru){
    console.log('我是函数表达式声明');
    console.log(aru);
}

JS的作用域

复习target

  • JS的两种作用域是什么
  • 如何区分 全局变量和局部变量
  • 如何在作用域链中查找变量的值 

目录

1.作用域

2.变量的作用域


1.作用域

1.1概述

通常来说,一段程序代码所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

2.2 JS 的作用域

在ES6标准之前,分为全局作用域和局部作用域。

  • 全局作用域:作用域是整个 script标签,或者 是一个单独的js文件。
  • 局部作用域:在函数内部就是局部作用域,这个代码的名字只在函数内部起效果和作用。

2.变量的作用域

2.1 变量作用域的分类

根据作用域的不同,可以分为:全局变量 和 局部变量。

2.2 全局变量

在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)

  • 全局变量在代码的任何位置都可以使用
  • 在全局作用域下 var 声明的变量是全局变量
  • 特殊情况下,在函数内不适用 var 声明的变量也是全局变量(不建议)

2.3 局部变量

在局部作用域下声明的变量叫做局部变量。(在函数内部定义的变量)

  • 局部变量只能在该函数内部使用
  • 在函数内部 var 声明的变量是局部变量
  • 函数的 形参 实际上就是局部变量

2.4 全局变量和局部变量的区别

全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存

局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此更节省内存空间。

3.作用域链

作用域链:内部函数访问外部函数的变量,采取的是链式查找的方法来决定取哪个值。这种结构我们称为作用域链。就近原则。

案例: a = 4; b = 22;

预解析

复习target

  • 解析器运行 js 分为哪两步
  • 说出 变量提升的步骤和运行过程
  • 说出 函数提升的步骤和运行过程

目录

1.预解析概念

2. 变量预解析和函数预解析

3.预解析案例


1.预解析概念

JS 引擎在运行 JS 代码时分为两步: 预解析 和 代码执行。

  • 预解析:JS 引擎会把 JS 里面所有的 var 和 function 提升到当前作用域的最前面
  • 代码执行:按照代码书写的顺序从上往下执行。

2. 变量预解析和函数预解析

预解析分为 变量预解析(变量提升)函数预解析(函数提升

  • 变量提升:指把所有的变量声明提升到当前作用域的最前面 不提升赋值
  • 函数提升:指把所有的函数声明提升到当前作用域的最前面 不调用函数

// 案例1
console.log(num);    //报错,为声明
// 案例2
console.log(num);    //undefined,提升了变量声明,但不提升赋值
var num = 10;
// 案例3
fn();
function fn(){
    console.log(11);
}
//成功执行函数

// 案例4
fun();
var fun = function(){
    console.log(22);
}
//报错“fun不是一个function”
//原因:只提升了声明fun变量,但没有提升函数赋值

3.预解析案例

// 相当于以下代码
var a;
function f1(){
    var b;
    var a;
    b = 9;
    console.log(a);
    console.log(b);
    a = '123';
}
a = 18;
f1(); 
//输出结果是 a=undefined,b=9;

//相当于以下代码
function f1() {
    var a;
    a = b = c =9;
    // 三个等号,相当于 var a=9;b=9;c=9  b和c没有声明直接赋值,属于全局变量
    // 集体声明写法: var a=9,b=9,c=9;
    console.log(a);
    console.log(b);
    console.log(c);
}
f1();     //输出结果 , 9 9 9
console.log(c);    // 9
console.log(b);    // 9
console.log(a);    // undefined

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值