函数基础,定义与调用。作用域,闭包函数

一、函数的定义与调用

函数是一段可重复使用的代码块,用于执行特定任务或计算等功能。它可以接受输入参数(形参),并根据参数执行操作后返回结果。

函数的定义

例如在 JavaScript 中可以这样定义函数:

function fun() { return "Hello,world"; }

函数的调用

通过函数名加小括号的方式调用函数,如document.write(fun());。一个函数可以有多个return语句,但调用时只有第一个return语句被执行,其后面表达式的值作为返回值,后面的代码被忽略。函数返回值无类型限制。

函数的形参和实参

形参

是声明函数时写在函数名后的小括号内的参数,用变量名接收,如

function add(x, y)中的xy

实参

是调用函数时写在小括号内的参数,如add(1, 2)中的12。形参和实参一一对应,如果形参没有实参对应,形参拿到的是undefined

this 关键字

this 是一个关键字,在函数执行过程中能访问运行环境,它是一个对象,其值根据函数的调用方式和上下文而变化,与函数的执行环节有关,与声明无关。它指向当前函数的运行环境,能在函数内部访问和操作当前对象的属性和方法。

函数的不同调用方式

作为方法被调用

当函数被赋值给一个对象的属性,并通过对象属性引用的方式调用函数时,函数作为对象的方法被调用。例如:

var person = {Name: "liux",Name2: "Dog",fullName: function() {return this.Name + " " + this.Name2;}};console.log(person.fullName());

使用构造函数调用函数

使用关键字new调用函数时,会创建一个新对象并作为this参数传递给构造函数,构造函数进行初始化设置后将新对象作为返回值。例如:

function a2(name) {this.name = name;this.greet = function() {console.log("你好,我是" + this.name);};}var a3 = new a2("lx");a3.greet();

作为函数方法调用函数

不同类型函数调用的主要区别在于最终作为函数上下文(this)传递给执行函数的对象不同。可以使用call()apply()方法显式指定函数调用时的上下文。call()接收参数列表,apply()接收数组作为参数。例如:

function add(a, b) {return a + b;}// 使用call()result1 = add.call(result1, 2, 3);// 使用apply()Array = [2, 3];result2 = add.apply(result2, Array);

二、函数参数设置

有参函数和无参函数

无参函数

定义函数时不设置参数,如

function A() { console.log("Hello World!"); }

有参函数

定义函数时设置了参数,如

function B(name) { console.log("Hello " + name + "!"); }

函数参数的其他特性

含有默认值的参数

在设置函数形参时可指定默认值,当调用者未传递该参数时,函数使用默认值操作。例如

function C(name = "World") { console.log("Hello " + name + "!"); }

剩余参数

函数定义时可利用 “… 变量名的方式动态接收不确定数量的实参,如function D(...args) { console.log(args); }

函数内外变量的作用域

全局变量

在函数外定义的变量是全局变量,可在函数内部和外部访问,如

var globalVar = 'I am a global variable';

局部变量

在函数内部使用var关键字定义的变量是局部变量,只能在该函数内部访问。未使用var定义的变量在函数内部也是局部变量。函数的参数也是局部变量。例如:

function localScope() {var localVar = 'I am a local variable';console.log(localVar);}localScope();

三、进阶函数

函数表达式

函数达式是将声明的函数赋值给一个变量,通过变量名 ()” 的方式调用函数,定义必须在调用前。与函数定义方式不同,函数表达式的定义顺序有要求且函数名可省略。例如

var fn = function sum(num1, num2) { return num1 + num2; }; fn(2, 3);

匿名函数

为什么要用匿名函数

团队合作时可避免函数名冲突。

匿名函数的实现方式

包括函数表达式中省略函数名,如var fn = function (num1, num2) { return num1 + num2; };;匿名函数自调用,如(function (num1, num2) { console.log(num1 + num2); })(2, 3);;处理事件,如document.body.onclick = function () { alert('Hi, everybody!'); }

箭头函数

特点

箭头函数可视为一种匿名函数形式,用于简化函数定义语法,没有传统函数名,通过箭头(=>)定义函数体。通常用于不需要显式函数名的场景,如作为回调函数传递给其他函数。

语法

箭头函数的小括号中可传入参数,如var fn = (num1, num2) => { return num1 + num2; };。当函数体只有一句代码且执行结果是返回值时,可省略大括号和return关键字;当参数只有 1 个时,可省略参数外部小括号。

回调函数

定义

一个函数 A 作为参数传递给一个函数 B,然后在 B 的函数体内调用函数 A,称函数 A 为回调函数。

同步回调

同步回调是阻塞的,回调函数在调用它的函数完成任务后立即执行,程序执行顺序是线性的。例如:f

unction A1(a, b, callback) {var result = a + b;if (typeof callback === 'function') {callback(result);}}function A2(result) {console.log('计算结果是: ' + result);}A1(3, 4, A2);

异步回调

异步回调是非阻塞的,回调函数在调用它的函数完成任务之后某个时间点执行。例如:

function add(a, b, callback) {setTimeout(function() {callback(a + b);}, 1000);}function aResult(result) {console.log("结果是:" + result);}add(2, 3, aResult);

异步回调函数与异步函数

异步回调函数

使用回调函数处理异步操作,适合简单情况,但代码可能较复杂。例如模拟点奶茶,服务员准备奶茶时顾客可做其他事,准备好后调用回调函数通知顾客。

异步函数

使用asyncawait关键字简化异步操作执行,让异步代码更像同步代码,提高可读性和可维护性。例如使用异步函数点奶茶,顾客点餐后可先去做别的事,等餐时通过await暂停代码执行,拿到奶茶后继续执行。

四、函数作用域相关

作用域的概念

作用域是可访问变量的集合,是根据名称查找变量的一套规则。JavaScript 采用词法作用域(静态作用域),包括全局作用域和函数作用域。

全局作用域

在最外层函数和最外层函数外面定义的变量拥有全局作用域,所有脚本和函数均可使用。例如var carName = "Volvo";在任何脚本和函数内均可访问。

局部作用域

变量在函数内声明为局部变量,其生命周期仅限于函数执行期间,外部无法直接访问。只有函数的{}构成作用域,对象的{}以及if() {}都不构成作用域。letconst声明的变量会产生块作用域,var不会。例如:


function myFunction() {var carName = "Volvo";}

词法作用域

词法作用域依据变量在源代码中的位置查找变量,从当前作用域开始向上遍历到包含它的所有外层作用域,直到找到定义。其特点包括静态作用域、封闭作用域和模块化。例如内部函数可访问外部函数中定义的变量。

变量提升

变量提升是指变量声明会被提前到其所在作用域的顶部,但只有变量声明会被提升,而不是变量赋值。例如var关键字定义的变量可以在使用后声明。

块级作用域

块级作用域是在代码块({}包裹部分)内声明的作用域,ES6 引入,通过letconst关键字声明的变量具有块级作用域,只能在声明所在代码块内可见。例如:

if(true){let var5="var5";console.log(var5)}

作用域链

作用域链是由多个嵌套的作用域组成的机制,用于解析标识符(变量和函数),决定了变量和函数的查找顺序。从当前作用域开始查找,找不到则向上一级作用域查找,直到找到或达到全局作用域。例如内部函数可访问自身、外层函数和全局作用域内的变量。

五、闭包函数

闭包的概念

闭包函数是在一个函数内部创建的函数,内部函数可以访问到外部函数的变量和参数,即使外部函数执行完毕,这些变量和参数仍然能够被内部函数访问。

闭包的特点

  • 让外部访问函数内部变量成为可能。
  • 局部变量会常驻在内存中。
  • 可以避免使用全局变量,防止全局变量污染。
  • 会造成内存泄漏。

闭包的创建

闭包通常是在另一个函数内部定义一个函数,内部函数作为原函数的返回值返回。例如:

function 外部函数() {var 局部变量 = "我是一个局部变量";function 内部函数() {console.log(局部变量);}return 内部函数;}var 闭包 = 外部函数();闭包();

闭包的应用

  • 创建私有变量和方法,用于模块化编程。
  • 在事件处理器和回调函数中保持变量的状态,用于异步编程。
  • 实现柯里化和函数组合等高级函数编程技巧。

闭包的注意事项

闭包会保留外部函数的变量,可能导致额外的内存消耗和内存泄漏,使用时需注意内存管理和性能问题。

六、递归函数

递归函数是自身调用自身的函数,但要注意一定要有递归结束的条件,并且要改变递归条件的代码。例如求 1 - 100 的累加值的递归函数:

function sum(n) {if(n == 1) {return 1;}return sum(n - 1) + n;}sum(100);

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

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

相关文章

python代码中通过pymobiledevice3访问iOS沙盒目录获取app日志

【背景】 在进行业务操作过程中,即在app上的一些操作,在日志中会有对应的节点,例如,下面是查看设备实时视频过程对应的一些关键节点: 1、TxDeviceAwakeLogicHelper:wakeStart deviceId CxD2BA11000xxxx …

C# OpenCvSharp DNN UNet 推理

目录 效果 模型 项目 代码 下载 效果 模型 Inputs ------------------------- name:data tensor:Float[1, 3, 256, 256] --------------------------------------------------------------- Outputs ------------------------- name:p…

Flutter仿京东商城APP实战 用户中心基础布局

用户中心界面 pages/tabs/user/user.dart import package:flutter/material.dart; import package:jdshop/utils/zdp_screen.dart; import package:provider/provider.dart;import ../../../store/counter_store.dart;class UserPage extends StatefulWidget {const UserPage…

D52【python 接口自动化学习】- python基础之模块与标准库

day52 标准库 学习日期:20241029 学习目标:模块与标准库 -- 67 标准库:Python默认提供的便携功能有哪些? 学习笔记 标准库中的常见组件 如何通过官方文档学习标准 from urllib.request import urlopen with urlopen(http://ww…

芒果YOLO11改进:免费|注意力机制SKNet:选择性内核网络结构,不同关注会产生融合层神经元有效感受野

💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLO11 按步骤操作运行改进后的代码即可 YOLO11改进:注意力机制|YOLO11SKAttention改进内容🚀🚀🚀 文章目录 1. SKAttention 论文…

顺序表排序相关算法题|负数移到正数前面|奇数移到偶数前面|小于x的数移到大于x的数前面|快排思想(C)

负数移到正数前面 已知顺序表 ( a 1 , … , a n ) (a_{1},\dots,a_{n}) (a1​,…,an​),每个元素都是整数,把所有值为负数的元素移到全部正数值元素前边 算法思想 快排的前后指针版本 排序|冒泡排序|快速排序|霍尔版本|挖坑版本|前后指针版本|非递归版…

如何在Linux系统中使用LVM进行磁盘管理

如何在Linux系统中使用LVM进行磁盘管理 LVM简介 安装LVM 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 创建物理卷 准备磁盘 创建卷组 创建逻辑卷 格式化逻辑卷 挂载逻辑卷 扩展逻辑卷 扩展现有物理卷 添加新的物理卷 调整卷组 调整卷组大小 使用LVM快照 LVM监控 查…

kaggle 数据集下载

文章目录 kaggle 数据集下载(1) 数据集下载(2) 手机号验证 kaggle 数据集下载 这两天想学习 kaggle 赛事 把深度学习相关的内容自己给过一遍,快忘得差不多了,惭愧。 参考了好多帖子,使用命令行…

力扣题86~90

题86(中等): python代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def partition(self, head: Optional[Li…

Http 状态码 301 Permanent Rediret 302 Temporary Redirect、 重定向 重写

HTTP状态码301和302是什么? 1、HTTP状态码301 HTTP状态码301表示永久性转移(Permanent Redirect),这意味着请求的资源已经被分配了一个新的URI,以后的引用应该使用资源现在所指的URI。 HTTP 301状态码表示请求的资源…

数据结构————map,set详解

今天带来map和set的详解&#xff0c;保证大家分清楚 一&#xff0c;概念 map和set是一种专门用来搜索的容器或数据结构 map能存储两个数据类型&#xff0c;我们称之为<key-value>模型 set只能存储一个数据类型&#xff0c;我们称之为纯<key>模型 它们的效率都非…

java中Scanner的nextLine和next方法

思考&#xff0c;输入1 2 3 4 5加上enter&#xff0c;输出什么 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int[][] m new int[2][2];for (int i 0; i < 2; i) {for (int j 0; j < 2;…

互联网人小生意平台推荐,思考适合你的副业机会!

前几天写了一篇关于互联网人尽早找到自己一人能做的小生意&#xff0c;尽早觉醒&#xff1a;找到自己一人能做的互联网生意 收到不少读者私信和评论关于小生意怎么做&#xff0c;能感觉到大家对于如何开启小生意及如何利用好互联网平台这块充满兴趣。 尤其是针对设计、技术等互…

第5次CCF CSP认证真题解

1、数列分段 题目链接&#xff1a;https://sim.csp.thusaac.com/contest/5/problem/0 区分每一段的方法就是判断数列中的每一个数是否与前一个数相等。 100分代码&#xff1a; #include <iostream> using namespace std; int main(int argc, char *argv[]) {int n;ci…

python 深度学习 项目调试 识别数学公式 LaTeX-OCR

起因&#xff0c; 目的: 提取图片中的数学公式。 其实这个项目&#xff0c;我很久之前就做过。 而且,我还录了一个视频: https://www.bilibili.com/video/BV1nD421p7jS/?vd_source198e876d811b3ccea94908fd163c223f 简介: 项目来源: https://github.com/lukas-blecher/La…

【专题】计算机网络之数据链路层

数据链路层的地位&#xff1a;网络中的主机、路由器等都必须实现数据链路层。 数据链路层信道类型&#xff1a; 点对点信道。 使用一对一的点对点通信方式。 广播信道。 使用一对多的广播通信方式。 必须使用专用的共享信道协议来协调这些主机的数据发送。 1. 使用点对点信道…

手机备忘录怎么导出到电脑,

在忙碌的现代生活中&#xff0c;我们常常需要在手机和电脑之间切换工作&#xff0c;手机里的备忘录记录了我们的重要事项&#xff0c;有时候需要在电脑端查看和处理。那么&#xff0c;如何将手机备忘录的内容导出到电脑呢&#xff1f;其实&#xff0c;这个问题的解决方法并不复…

【Python爬虫】获取汽车之家车型配置附代码(2024.10)

参考大哥&#xff0c;感谢大哥&#xff1a;https://blog.csdn.net/weixin_43498642/article/details/136896338 【任务目标】 工作需要想更方便地下载汽车之家某车系配置清单&#xff1b;&#xff08;垃圾汽车之家不给下载导出表格&#xff0c;配置页叉掉了车系要出来还要重新…

架构师备考-背诵精华(计算机语言)

定义 计算机语言是指用于人与计算机之间交流的一种语言&#xff0c;是人与计算机之间传递信息的媒介。计算机语言主要由一套指令组成&#xff0c;而这种指令一般包括&#xff1a;表达式、流程控制和集合三大部分内容。 表达式包括&#xff1a;变量、常量、字面量和运算符流程控…

一个简单的 uas_send_bye.xml for SIPp

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE scenario SYSTEM "sipp.dtd"> <scenario name"iinv-o200-obye.xml -- wjd 2014"><recv request"INVITE" rrs"true"/><send>&l…