二、(3)JavaScript函数

JavaScript-函数

 

1. 函数(重点)

  函数:函数其实就是对一段代码进行封装,被封装的代码总是完成某项功能,函数不会主动的运行,需要在程序中手动的调用函数(比如:用户点击的时候),并且可以多次调用这个函数。

函数的定义

  因为函数可以封装一个功能,该功能可以被多次使用从而达到代码重复使用,函数是代码封装和代码复用的体现。

最简单的定义语法

方式一:函数声明,必须指定函数名

function 函数的名字(){
    //功能代码(函数体)
}

  通过函数的名字调用执行,如果先多次执行,那么就多次调用:

  函数的名字();

方式二:函数表达式,函数名可以选

var 变量 = function(){
    //功能代码(函数体)
};
    //函数其实也是一种数据类型,所有把函数赋值给一个变量是可行的,与var a =123与这种赋值一样。

函数的调用

  函数封装(打包)了一段代码,被函数(打包)封装的代码不会自动运行,它需要我们在合适的时候调用这个函数。

  调用函数:其实就是执行函数中封装的代码。

  调用函数语法: 函数名();

函数定义举例

函数参数(形式参数)

为什么用形式参数(形参)

  函数是用来完成一个功能,但是有时候后完成此功能时需要数据的参与,而这些数据只有在使用该功能时能够确定。

  调用函数时可以把函数中需要的数据传入到函数中,那么就需要使用参数。

  比如:函数中,计算两个数的和,但是这个两个数可以是任何的数据。

形式参数定义

写在函数定义中,出现在函数名的()里面

function 函数名字(形式参数1,形式参数2){
    功能代码…
}

1.2.3. 参数举例说明

  使用函数是传入的参数数据叫做实际参数(实参)
  执行过程: 实际参数分别赋值后形式参数后,方法才执行.

参数默认值

ES5:默认值方式

ES6:默认值方式

函数返回值

使用返回值:函数功能代码执行结果可能被其他的程序使用.

函数返回值定义

  如果函数执行参结果的数据需要被其他程序所使用. 可以通过return关键字标记函数执行的结果(返回结果)。

function 函数名(形参1,形参2){
    //功能代码.
    return 功能代码运算结果;
}

返回值举例

 

  执行过程:将1赋值为num1, 2赋值给num2后在执行函数.

传入实际参数时注意:

  • 1. 实际参数列表的顺序和形式参数的顺序一一对应
  • 2. 实际参数列表的类型和形式参数的期望类型一一对应

函数返回值注意点

① 函数第一次遇到return就结束执行,不管return后面还有多少代码都不执行

② 如果函数没有指明return,函数默认的返回值为undefined,否则以return返回值为准

定义函数三部曲

function 函数名(参数,参数){
    //功能代码 (函数体)
    return 返回值;
}
var result = 函数名(实参,实参);

练习:

1. 设计比较两个数的最大值功能

2. 设计制作任意行数和列数表格的功能

<tr>
<td></td>
</tr>

2. 变量的作用域(重点)

变量作用域定义

  变量作用域指的是一个变量在哪个范围内可以使用,变量作用域被函数分为两种。

  • 全局变量:函数外定义的变量,整个程序中都可以使用。
  • 局部变量:在某个特定的函数中定义的变量,称之为局部变量,只能够在函数内部使用

全局变量的特殊形式:在函数内定义但是没有加var,也被作为全局变量使用。

为什么要用变量作用域

  可以在不同的范围内(函数外和函数内)使用相同的变量名字,引用不同的值。

如何选择变量的作用域

  如果变量的数据只在函数内部使用,请使用局部变量。
  如果变量的数据函数内部和外部都要使用,请使用全局变量。

3. 编译原理(了解)

一个奇怪的现象

JavaScript引擎执行原理(了解)

  首先,在代码领域中,代码引擎是用来读懂开发者编写代码的一段程序。就如我们编写了一段的JavaScript代码(var a = 1 +1),JavaScript引擎就是用来看懂(解析)这段JavaScript代码,计算获得结果2,并将a的值变为2。

  User.java ===> User.class(字节码) 编译型语言(需要使用一个程序进行编译,并生成另外一种可以被计算识别的语言.简单理解,java这一类语言对计算机来说都是外语,需要翻译)

  User.js ==> User.js 解释型语言(在执行时,才会进行编译,进行解析和执行.直接可以识别,不需要翻译)

  语言主要分为两大类:编译型语言和解释型语言。对于静态语言来说(如Java、C++、C),处理上述这些事情的叫编译器(Compiler),相应地对于JavaScript这样的动态语言则叫解释器(Interpreter)。这两者的区别用一句话来概括就是:编译器是将源代码编译为另外一种代码(比如机器码,或者字节码),而解释器是直接解析并将代码运行结果输出。我们常用的firebug就是一个JavaScript解释器。

当JavaScript引擎解析脚本时,分为“语法分析”、“预编译”和“解释执行”三个阶段。

  • 1、“语法分析”阶段。引擎检查你的代码有没有什么低级的语法错误。
  • 2、“预编译”阶段。首先会创建一个环境的上下文对象,然后把使用var声明的变量,作为上下文对象的属性,以undefined先行初始化;使用function关键字声明的函数,也作为上下文对象的属性,定义出来,而函数则保留了定义的内容。----在这个过程中,函数定义的优先级 高于 变量定义。
  • 3、“解释执行”阶段。遇到变量解析,会先在当前上下文对象中找,如果没找到并且当前上下文对象有prototype属性,则去原型链中找,否则将会去作用域链中找。
// 正确
alert(num); // 返回值undefined
var num =100;
alert(num); // 返回值100
// 正确
fn(); // 调用函数,返回值 ==> 函数调用成功!!
    function fn(){
    alert(‘函数调用成功!!’);
}

小结:

  • 1. JavaScript引擎解析脚本分为3个阶段,预编译和解释执行
  • 2. var变量和函数声明都有提升,函数优先级高
  • 3. let&const没有变量提升

4. 系统函数

定义:在浏览器已经定义好并且告知给计算机的函数(功能), 我们无需定义直接使用即可。

有哪些函数

  • String(值):将值转换为字符串
  • Number( 值):将值转换为数字类型
  • Boolean(值): 将非布尔类型值转为布尔类型 0 “” null转换为false 其余转换 为true
  • parseInt (值):转为整数
  • parseFloat(值):转为小数类型
  • isNaN(值):判定 值 如果不是数字 返回为true 是数字返回为false

5. 递归函数(了解)

递归函数定义:在函数体内对函数自身调用。

案例:通过递归的函数打印出1—9的数值:

递归函数的前提

  • 1. 完成用户需要必须是一个函数
  • 2. 函数必须有出口

为什么要使用递归函数

  大问题拆解成小问题,小问题与大问题的解决思路一致!它往往使函数的描述简洁而且易于理解。

递归调用的特点

递归算法所体现的“重复”一般有三个要求:

  • 一是每次调用在规模上都有所缩小(通常是减半);
  • 二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
  • 三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。

实例:使用递归算法打印1-num的累加

  递归点: num+(num-1)

  递归出口: num==1 || num==0;

/*使用递归算法打印1-N的累加*/
function f(num){
    if(num==1 || num==0){
    return num;
}
    return num+f(num-1);
}
console.log(f(100));

6. 作业

1、是否可以把函数赋值给一个变量,为什么?

2、封装函数,实现返回三个数的和

3、封装函数,实现返回三个数的最小值

4、全局变量和局部变量的区别

5、使用递归求菲波拉契数列的第20个的值

posted @ 2021-01-19 13:54  全村的希望、  阅读(112)  评论(0编辑  收藏  举报