JavaScript-----函数

news2024/10/7 18:30:43

目录

前言:

JavaScript函数

1. 定义函数

构造函数

2. 调用函数

函数的自执行

3. 函数的参数

4. 函数返回值

5. 作用域

6. 匿名函数

7. this指向性问题(重点)

7.1 this的性质

7.2 call的用法

7.3 apply的用法

7.4 bind的用法(了解)

 8.结构赋值(拓展)


前言:

        今天我们就开始学习JavaScript里面的函数,函数是编程语言的重要组成部分之一,在此之前我们学习过了C语言就知道函数的相关性质了,那下面我们就学习JavaScript里面的函数,对于于C语言又会有那些不同呢。

JavaScript函数

函数是利用特定语法,将一段代码打包在一起,每次调用函数就可以让这个代码块内的代码全部执行,复用代码。

要注意的是,函数跟循环不相似,循环是重复一定次数的执行代码,函数虽然可以重复执行代码,但是它很灵活,可以任意决定它调用的时机

1. 定义函数

JS 函数声明需要以function 关键字开头,之后为要创建的函数名称,function关键字与函数名称之间使用空格分开,函数名之后为一个括号( ),括号中用来定义函数中要使用的参数(多个参数之间使用逗号,分隔开),最后为一个花括号{ },花括号中用来定义函数的函数体(即实现函数的代码),如下所示:

//函数声明
function 函数名(参数列表){
   // 函数体
    return 返回值;
}

函数名自定义,见名知意,命名规范参照变量的命名规范。普通函数以小写字母开头,用于区分构造函数(构造函数使用大写字母开头,定义类)

JavaScript 对于大小写敏感,所以在定义函数时 function 关键字一定要使用小写,而且调用函数时必须使用与声明时相同的大小写来调用函数。

构造函数

构造函数是函数定义的一种,在此之前我们也是学习过了的,在JavaScript里面是通过new去定义一个构造函数 

let name=new function('参数1','参数2',……,"执行语句")

不过,这里并不建议去使用构造函数,因为很容易出现一些语法错误,况且也是比较麻烦的,最好还是去所以函数的定义去定义一个函数。 

2. 调用函数

一旦定义好了一个函数,我们就可以在当前文档的任意位置来调用它。调用函数非常简单,只需要函数名后面加上一个括号即可。

注意,如果在定义函数时函数名后面的括号中指定了参数,那么在调用函数时也需要在括号中提供对应的参数。

     function fun(){
            console.log('hello world');
        }
        //调用函数
        fun(); //打印hello world

函数的自执行

函数的自执行就是定义了函数之后让它自动执行,格式如下:

!function(){ 内容 }() 

3. 函数的参数

函数的参数分为形式参数和实际参数,简称形参和实参

  • 形参即在定义函数时,括号内声明的参数。形参本质就是一个变量名,用来接收外部传来的值。

  • 实参即在调用函数时,括号内传入的值。

  • 在调用有参函数时,实参(值)会赋值给形参(变量名)。

  • 这种关系只在函数调用时生效,在调用结束后解除。

参数的默认值:在定义函数时,你可以为函数的参数设置一个默认值,这样当我们在调用这个函数时,如果没有提供参数,就会使用这个默认值作为参数值。

Rest参数:rest是剩余的意思,rest参数是用于函数参数不确定,每次传入的数量都不同,或者函数参数过多,但是又不想写那么多形参的情况,那么rest可以一次性全部接收

4. 函数返回值

在函数中可以使用return语句将一个值(函数的运行结果)返回给调用函数的程序,这个值可以是任何类型。对于有返回值的函数,我们可以会使用一个变量来接收这个函数的返回值。return语句通常在函数的末尾定义,当函数运行到return语句时会立即停止运行,并返回到调用函数的地方继续执行。

return后放了多条数据,只会返回最后一条数据。如果没有去设置return的话,那么函数的返回值默认为undefined

5. 作用域

作用域通俗的说,是变量起作用的范围。因为每个变量都有对应的“生活环境”

JavaScript中作用域主要分为以下几种:

  • 全局作用域(即script标签内的空间)

  • 函数作用域(每个函数的花括号内的部分)

  • 块作用域(除函数外,其他的花括号空间都是块作用域,如if的花括号)

// 此时这里是script内部,所以这个空间是一个全局作用域,在此环境声明的变量为全局变量
let a = 1 // a 为全局变量

let fn = function () {
    // 这是函数体内,所以这个小空间是函数作用域
    let a = 2 // 此时这个变量a服务与这个空间和这个空间的子空间
    console.log(a) // 当前使用的a在这个环境中存在,所以输出 2

    {
        // 此处,直接写了一个花括号,那么就开启一个独立的空间
        // 此时当前空间没有a,所以向上个空间查找,就找到函数内的a,所以输出 2
        console.log(a) 
    }
}

// 此时的console语句是在全局环境执行,所以这里的a不是函数内的,而是全局环境的a  所以输出 1
console.log(a)  

let fn2 = function () {
    {
        // 此时这个块作用域自身空间没有a,向上级空间查找,上级空间是fn2的函数空间,也没有找到,继续向上级查找,在全局空间找到了,所以输出 1
        console.log(a)
    }
}

查找的规则是,先查找自身,如果查找到就用,就不在向上查找,如果没有依次向上层作用域找,直到找到为止。如果找到全局都没有找到对应名称的变量,则抛出错误xxx is not defined。这就是作用域的规则。

6. 匿名函数

匿名函数:省略函数名的函数。语法为:

(function (形参){
  
 })(实参);

7. this指向性问题(重点)

7.1 this的性质

this是一个关键字,js赋予它特殊的意义。指向调用函数的对象,如果没有,则指向window。(意思是说谁调用了这个函数,那么结果就指向谁)

function fn(){ 
    console.log(this);  // 指向window  
        }
        fn();
//输出:Window {window: Window, self: Window, document: document, name: '', location: 、Location, …}

下面看个示例:

//创建一个对象
        let a={
            name:'jack',
            fun:function(){console.log(this.name)}//这里的this指向了前面的name属性
        }

执行结果:

现在要做的就是这么去实现this的指向进行改变,那么以下的三种方法可以去实现改变this指向,我们接着往下看。 

7.2 call的用法

通过JavaScript里面的call函数,我们可以去通过这个函数来去调用其指向的函数并且进行传参操作。其语法为:call(this指向的对象,形参1,形参2……)

看个代码示例: 

 //call的用法
        let a={
            fun:function(){
                console.log(arguments);//argument是作为参数的储存列表,可以通过打印argument查看参数内容以及数量
                return this.name1+this.name2;
            }
        }
        let b={
            name1:'蕾',
            name2:'姆'
        }
        var x=a.fun.call(b,486);
        console.log(x); //输出:蕾姆

 以上是先去创建一个a和b对象,这里我想去通过a里面的函数去指向b对象里面的属性进行调用,于是就可以去通过call函数将b里面的属性被a对象指向然后被调用。

7.3 apply的用法

 相似的,apply的语法跟call差不多的,但不同的是参数的传入形式不同,apply只能去通过数组的形式来传入参数,而call是直接传入参数的,apply的格式为:apply(this指向的对象,[数据1,数据2……])

//apply的用法
        let a={
            fun:function(){
                console.log(arguments);
                return this.name1+this.name2;
            }
        }
        let b={
            name1:'蕾',
            name2:'姆'
        }
        var x=a.fun.apply(b,['艾米莉亚','拉姆']);
        console.log(x); //输出:蕾姆

结果:

7.4 bind的用法(了解)

与call不同的是,bind并不会立即执行,其语法是与call一样的。bind的作用仅仅是去改变this的指向而已,并不会去执行这条语句,实际上并没有太大的用处,可以说是基本上不会用到

let a={
            fun:function(){
                console.log(arguments);
                return this.name1+this.name2;
            }
        }
        let b={
            name1:'蕾',
            name2:'姆'
        }
        var x=a.fun.bind(b,'大脑在颤抖');
        console.log(x); 

 8.结构赋值(拓展)

之前我们对变量去赋值的时候是一一赋值的,如果我们想一次性去对这些变量进行赋值的话可以去通过结构赋值。

 看个示例:

let a,b;
    [a,b]=[10,20];   //对a,b依次赋值     
    console.log(a,b);
    [a,b]=[b,a];    //a,b进行数值交换
    console.log(a,b);
    /*输出结果:10 20
               20 10*/

好了,以上就是今天的全部内容了,我们下一期再见!

分享一张壁纸: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/976675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KMP超高效匹配算法

简介: KMP算法是一种改进的字符串匹配算法,其中,KMP算法的运用核心是利用匹配失败后的信息,最大进度的减少模式串与目标串的匹配次数以达到快速匹配的效果。算法与暴力求解的改进在于每当一趟匹配过程中出现的字符比较不相等时&am…

无涯教程-JavaScript - NOW函数

描述 NOW函数返回当前日期和时间的序列号。 语法 NOW ()争论 NOW函数语法没有参数。 Notes 如果在输入功能之前单元格格式为"常规",则Excel会更改单元格格式,使其与您的区域设置的日期和时间格式匹配。您可以使用功能区"主页"options卡"数字&quo…

Java学习笔记——34多线程01

多线程 实现多线程进程和线程的区别多线程的实现方式方式一:继承Thread类设置线程名称线程调度线程控制线程生命周期 方式二:实现Runnable接口 实现多线程 进程和线程的区别 进程:是正在运行的程序 是系统进行资源分配和调用的独立单位每一…

文章预览 安防监控/视频存储/视频汇聚平台EasyCVR播放优化小tips

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成,…

IG 自动回复:提供无间断客户互动体验

图片来源于:SaleSmartly官网 2023,Instagram拥有将近13亿的月活跃用户,在香港拥有超过400万活跃用户。 Instagram 以图片、长短影片、直播等高互动性的互动方式,吸引了广大的年轻族群,34岁以下的用户即占比了将近全球整…

Day55|动态规划part16:583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

583. 两个字符串的删除操作 leetcode链接:力扣题目链接 视频链接::LeetCode:583.两个字符串的删除操 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。每步 可以删除任意一个字符串中的…

两个路由器如何连接设置的方法攻略

一、前言 随着智能家居时代来临,家里的网络部署需求开始复杂起来。往往一个路由器已经不能满足需求或者不利于拓展。两个路由器连接最常见的情况是家中已有一个路由器,并且已经通过这个路由器来正常上网。现在是因某些原因想在不改变已经在用的路由器的设…

mysql 字段用了关键字, 无法插入更新数据

1. 表字段用了关键字 explain 2. sql语句中用包裹住关键字 (注意不是单引号) <if test"explain ! null">explain,</if>

CRMEB多端多语言系统文件上传0Day代审历程

Git仓库&#xff1a; https://github.com/crmeb/CRMEB简介&#xff1a; 两天攻防中&#xff0c;某政局子公司官网后台采用的CRMEB开源商城CMS&#xff0c;挺奇葩&#xff0c;别问怎么总让我碰到这种东西&#xff0c;我也不知道&#xff0c;主打的就是一个魔幻、抽象。最后通过…

基于环形队列的生产消费模型

目录 一、信号量 1.提出问题 2.信号量的概念 3.信号量的基本操作 &#xff08;1&#xff09;PV操作 &#xff08;2&#xff09;信号量的使用 二、基于环形队列的生产消费模型 1.环形队列 &#xff08;1&#xff09;复习 &#xff08;2&#xff09;现象 &#xff08;…

酷雷曼第二期无人机技能培训圆满举办

第2期无人机技能培训 2023年8月24日-8月25日&#xff0c;第二期酷雷曼无人机技能培训及执照考试在北京圆满举办&#xff0c;来自五湖四海、全国各地的合作商千里相聚&#xff0c;培训现场热闹融洽&#xff0c;再续精彩盛况。 随着《无人驾驶航空器飞行管理暂行条例》正式发布…

Mysql中group by 使用中发现的问题

当使用 MySQL 的 GROUP BY 语句时&#xff0c;根据指定的列对结果进行分组。在 GROUP BY 分组时&#xff0c;如果某个字段在分组中有多个不同的值&#xff0c;那么就会出现你提到的该字段一直在变化的情况。 这种情况通常是由于在 GROUP BY 中选择的字段与其他非聚合字段不兼容…

【链表OJ 11】复制带随机指针的链表

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode138. 复制带随机指针的链表 1. 问题描述 2.代码思路: 2.1拷贝节点插入到…

操作系统强化认识之Shell编程学习与总结

目录 1.Shell的概述 2.Shell脚本入门 3.变量 3.1.系统预定义变量 3.2.自定义变量 3.3.特殊变量 4.运算符 5.条件判断 6.流程控制 6.1.if判断 6.2.case语句 6.3.for循环 6.4.while循环 7.read读取控制台输入 8.函数 8.1.系统函数 8.2.自定义函数 9.正则表示式入…

React原理 - React New Feature

目录 扩展学习资料 React Fragments/Portals/StrictMode【糖果】 Fragments【并列元素外包裹一个伪元素】 Portals【改变组件挂载节点】 Strict Mode【严格模式&#xff0c;老工程中使用&#xff0c;提示即将失效方法】 React Concurrent Mode【大招】 不可阻断渲染/可中…

【广州华锐互动】煤矿设备AR远程巡检系统实现对井下作业的远程监控和管理

煤矿井下作业环境复杂&#xff0c;安全隐患较多。传统的巡检方式存在诸多弊端&#xff0c;如巡检人员难以全面了解井下情况&#xff0c;巡检效率低下&#xff0c;安全隐患难以及时发现和整改等。为了解决这些问题&#xff0c;提高煤矿安全生产水平&#xff0c;越来越多的企业开…

C#winform自定义软键盘

软键盘应用 触摸一体机没有硬件键盘&#xff0c;系统软键盘占面积大&#xff0c;位于屏幕底部&#xff0c;点击不是很方便。某些时候只需要输入数字&#xff0c;这时弹出九宫格数字键盘就足够了。 以下实现的是弹出一个弹窗作为软键盘。 实现 创建一个窗体FrmSoftKey&#xf…

【Git-Exception】Git报错:fatal: unable to auto-detect email address

报错信息&#xff1a; *** Please tell me who you are. Run git config --global user.email “youexample.com” git config –global user.name “Your Name” to set your account’s default identity. Omit --global to set the identity only in this repository. fatal…

JVM:JIT实时编译器

一、相关 ⾼级编程语⾔按照程序的执⾏⽅式分为两种 编译型&#xff1a;一次性将代码编译为机器码解释型&#xff1a;通过解释器一句一句的将代码解释为机器码之后&#xff0c;再运行。每个语句都是执行的时候才翻译。 JAVA代码执行过程 &#xff08;编译阶段&#xff09;首先将…

SAP 物料主数据屏幕增强

增强步骤 1.为主表添加一个附加结构 根据业务需求新建一个结构&#xff0c;结构中放入需要增强的屏幕字段并激活。 打开事务代码SE11&#xff0c;在需要保存的主表中添加这个附加结构并激活。 注&#xff1a;根据业务需求及屏幕增强的视图判断需要保存的主表是哪张&#xff…