首页 > 其他分享 >04. 函数

04. 函数

时间:2023-01-17 22:44:45浏览次数:33  
标签:function console 函数 04 作用域 参数 hello

一、什么是函数

  函数就是可以作为一个逻辑单元对待的一组 JS 代码。使用函数可以使代码更加简洁,提高重用性。如果一段具有特定功能的程序代码需要在程序中多次使用,就可以先把它定义为函数,然后在需要这个功能的地方调用它,这样就不必多次重写这段代码。

二、函数的定义

2.1、函数声明

  在 JS 中,可以使用 function 语句来定义一个函数。使用 function 语句定义函数的基本语法如下:

function 函数名([参数1,参数2,...]){
    函数体;
    [return 返回值;]
}

  参数说明:

  • 函数名:必选,用于指定函数名。在同一个页面中,函数名必须是唯一的,并且需要区分大小写
  • 参数:可选,用于指定参数列表。当使用多个参数时,参数间需要使用逗号进行分隔
  • 语句:必选,是函数体。用于实现函数功能的语句
  • 返回值:可选,用于返回函数值。返回值可以是任意的表达式、变量或常量。
function hello(){
    alert('hello world!');
    console.log('hello world!');
}

使用 typeof 检查函数对象时会返回 function;

使用 function 声明的函数,都会作为 window 的方法保存;

使用函数声明创建的函数,会在其它代码执行前被创建,所以我们可以在函数声明前调用函数;

2.2、函数表达式

  函数表达式语法格式如下:

函数名 = function([参数1,参数2,...]){
    函数体;
    [return 返回值;]
}

  参数说明:

  • 函数名:必选,用于指定函数名。在同一个页面中,函数名必须是唯一的,并且需要区分大小写
  • 参数:可选,用于指定参数列表。当使用多个参数时,参数间需要使用逗号进行分隔
  • 语句:必选,是函数体。用于实现函数功能的语句
hello = function(){
    alert('hello world!');
    console.log('hello world!');
}

2.3、箭头函数

  箭头函数语法格式如下:

函数名 = ([参数1,参数2,...]) => {
    函数体;
    [return 返回值;]
}

  参数说明:

  • 函数名:必选,用于指定函数名。在同一个页面中,函数名必须是唯一的,并且需要区分大小写
  • 参数:可选,用于指定参数列表。当使用多个参数时,参数间需要使用逗号进行分隔
  • 语句:必选,是函数体。用于实现函数功能的语句
hello = () => {
    alert('hello world!');
    console.log('hello world!');
}

三、函数的调用

  函数定义后并不会自动执行,要执行一个函数需要在特定的位置调用函数。调用函数时需要创建调用语句,调用语句包含函数名称和参数具体值。函数调用的语法如下:

函数名([传递给函数的参数1,传递给函数的参数2,...])
function hello(){
    alert('hello world!');
    console.log('hello world!');
}

hello();

四、函数的参数

  在定义函数时,将指定的参数称为 形式参数,简称形参;而将调用函数时实际传递的值称为 实际参数,简称实参。

  在 JS 中定义函数的格式如下:

function 函数名(形参1,形参2,...){
    函数体;
}

  定义函数时,在函数名后面的圆括号内可以指定一个或多个参数(参数之间需要用逗号“,”分隔)。指定参数的作用在于:在调用函数时,可以为被调用的函数传递一个多个值。

  如果定义的函数有参数,那么调用该函数的语法格式如下:

函数名(实参1,实参2,...)

  在函数中定义参数,就相当于在函数内部声明了对应的变量但是没有赋值;在定义参数时,我们还可以为参数指定默认值,默认值会在没有对应实参时生效。在定义参数时,JS 中不会检查参数的类型,因此,我们可以传递任何类型的值作为参数。

  在一般情况下,在定义函数的使用了多少个形参,在函数调用时也会传递多少个实参。但是 JS 本身不会检测传递的实参个数与定义的形参个数是否相等。如果传递的实参个数小于函数定义的形参个数,JS 会自动将多余的形参的值设置为 undefined;如果传递的实参个数大于函数定义的形参个数,那么多余的实参将会被忽略。

function sum(a=0,b=0){
    alert(a + ' + ' + b + ' = ' + (a+b));
    console.log(a + ' + ' + b + ' = ' + (a+b));
}

sum(2,3);

五、函数的返回值

  对于函数调用,既可以通过参数向函数传递数据,也可以从函数中获取数据,也就是说函数可以有返回值。在 JS 的函数中,可以使用 return 语句为函数返回一个值。在 JS 中,任何值都可以作为返回值使用。如果 return 后不跟任何值,相当于返回 undefined。如果不写 return 函数的返回值依然是 undefined。return 一执行,函数立即结束。

  语法如下:

return 返回值;

  这条语句的作用是结束函数,并把其后表达式的值作为函数的返回值。

function sum(a=0,b=0){
    return a+b;
}

let a = 2;
let b = 3;
let result = sum(a,b);
console.log(a + ' + ' + b + ' = ' + (a+b));

如果箭头函数的函数体只有一条返回语句,箭头函数的返回值可以直接写在箭头后,例如:sum = (a,b) => a+b;

如果直接在箭头函数后设置对象字面量为返回值,对象字面量必须使用 () 括起来;

六、作用域

  作用域指的是一个变量的可见区域。在 JS 中,作用域可以分为两种:全局作用域块作用域

6.1、全局作用域

  全局作用域在网页运行时创建,在网页关闭时销毁。所有直接编写到 <script> 标签中的代码都位于全局作用域中。全局作用域中的变量是全局变量,可以在任意位置上访问。

let a = '全局变量';

{
    console.log(a);
}

在全局中使用 var 声明的变量,都会作为 window对象的属性保存;

使用 var 声明的变量,它会在所有代码执行前被声明,所以我们可以在变量声明前就访问变量,结果为 undefined;

let 声明的变量实际上也会提升,但是在赋值之前解释器禁止访问该变量;

6.2、局部作用域

  块作用域是一种局部作用域,块作用域在代码块执行时创建,代码块执行完毕它就销毁。在块作用域中声明的变量是局部变量,只能在块内部访问,外部无法访问。

{
    let a = 'hello';
    console.log(a);
}

  函数作用域也是一种局部作用域。函数作用域在函数调用时产生,调用结束后销毁。函数每次调用都会产生一个全新的函数作用域。在函数中定义的变量是局部变量,只能在函数内部访问,外部无法访问。

function fun(){
    let a = 'hello';
    console.log(a);
}

fun();

var 虽然没有块作用域,但有函数作用域;

在局部作用域中,如果没有使用 var 或 let 声明变量,则变量会自动称为 window 对象的属性,也就是全局变量。

6.3、作用域链

  当我们使用变量时,JS 解释器会优先在当前作用域中寻找变量,如果找到了则直接使用。如果没找到,则去上一层作用域中寻找,找到了则使用,如果没找到,则继续去上一层寻找。依次类推,如果一直到全局作用域都没有找到,则报错:Uncaught ReferenceError: xxx is not defined

let a = 'hello';

{
    let a = 123;
    console.log(a);
}

七、立即执行函数

  在开发中应该尽量减少直接在全局作用域中编写代码,避免被其他人员以外修改,所以我们的代码要尽量编写在局部作用域中。如果我们使用 let 声明的变量,可以使用 {} 来创建块作用域。

  立即执行函数(IIFE),是一个匿名的函数,并且它只会调用一次。可以利用立即执行函数创建一个一次性的函数作用域,避免变量冲突的问题。

// 创建一个只执行一次的匿名函数
(function(){
    let a = 'hello';
    console.log(a);
}());

八、函数中的this

  函数在执行时,JS 解析器每次都会传递进一个隐含的参数 this。this 会指向一个对象,this 所指向的对象会根据函数调用方式的不同而不同。

  • 以函数形式调用时,this 指向的是 window;
  • 以方法的形式调用时,this 指向的是调用方法的对象;

  通过 this 可以在方法中引用调用方法的对象。

function fun(){
    console.log(this);
}

fun();

箭头函数没有自己的 this,它的 this 有外层作用域决定;

箭头函数的 this 和它的调用方式无关;

标签:function,console,函数,04,作用域,参数,hello
From: https://www.cnblogs.com/nanoha/p/17058846.html

相关文章

  • Python中reshape函数(-1表示什么)
    https://blog.sciencenet.cn/blog-3428464-1247194.html reshape函数(-1表示什么)1.当原始数组A[4,6]为二维数组,代表4行6列。A.reshape(-1,8):表示将数组转换成8列的数组......
  • day04-Spring管理Bean-IOC-02
    Spring管理Bean-IOC-022.基于XML配置bean2.7通过util空间名称创建listBookStore.java:packagecom.li.bean;importjava.util.List;/***@author李*@version......
  • 具有依赖对象的构造函数注入
    如果类之间存在HAS-A关系,则首先创建依赖对象(包含对象)的实例,然后将其作为主类构造函数的参数传递。在这里,我们的场景是员工HAS-A地址。Address类对象将称为从属对象。首......
  • linux 04
    目录今日内容详细文件相关信息文件索引信息链接信息系统时间机器克隆定时任务paramiko模块公钥私钥paramiko其他操作代码封装今日内容详细文件相关信息#查看普通⽂件⼤......
  • C标准库 | 字符串转整数/浮点数函数汇总
    在日常LinuxC语言开发中,不可避免会用到字符串转整数或者浮点数的操作,例如带参数的​​main​​​函数中,在​​shell​​下对着某个命令输入一组数字参数,这组数字实际上是字......
  • C标准库 | 内存分配以及释放函数汇总
    在日常C语言使用过程中,不可避免遇到从堆中申请空间给特定的数据结构(结构体指针)!一、头文件#include<stdlib.h>文件所在路径:$ls/usr/include/stdlib.h二、函数声明/*Alloc......
  • [ROC-RK3399-PC Pro] 手把手教你移植主线U-Boot(基于v2022.04-rc5版本)
    ......
  • DataFrame - to_csv()函数乱码
    https://blog.csdn.net/weixin_39559994/article/details/125297263https://blog.csdn.net/qq_40258748/article/details/96306878......
  • FPGA综合实验 04 - | ADC采样控制电路设计
    一、实验目的和任务     学习用状态机对A/D转换器ADC0809的采样控制电路的实现。二、设计代码(或原理图)、仿真波形及分析1、ADC控制电路代码moduleADC0809(D,CLK,EOC,......
  • 数字电路实验 04 - | 组合逻辑电路的设计与测试
    一、实验目的和任务掌握组合逻辑电路的分析与设计方法。加深对基本门电路使用的理解。二、实验原理介绍三、实验数据、计算及分析ABCDZ00000001000100001100100001010011000......