07_JavaScript函数作用域_递归
目录
一、作用域(重点)
二、变量的使用规则 (重点)
2.1 访问规则
2.2 赋值规则
三、递归函数 (难点) 了解
四、对象
4.1 对象的创建
一、作用域(重点)
-
什么是作用域 ?
作用域(上下文),就是一个变量可以生效的范围!!!
变量并不是所有的地方都可以使用,而这个变量的使用范围就是作用域
- 作用域有两个
-
全局作用域
- 全局作用域就是最大的作用域
- 在全局作用域下定义的变量可以在任何地方使用
- 这个作用域会一直存在,直到页面关闭就销毁了var num = 100;
var num1 = 200;if(true){console.log(num,num1);
}function fn(){console.log(num,num1);
}
fn();console.log(num,num1);
- 局部作用域
- 在js中 只有函数能生成局部作用域,别的都不行!!!
- 局部作用域就是在全局作用域下开辟出一个相对小的作用域
- 局部作用域的变量只能在这个作用域内使用
- 每一个函数 都是一个局部作用域function fn1(){// 就是一个局部作用域var num = 100;console.log(num);
}
//console.log(num); //num is not defined
fn1();function fn2(){var aaa = "hhh";console.log(aaa);console.log(num);// num is not defined
}
fn2()
二、变量的使用规则 (重点)
-
有了作用域以后,变量有了使用范围,也有了使用规则
-
变量的使用规则
访问规则和赋值规则
2.1 访问规则
-
当我想获取一个变量的值的时候,这个行为就叫访问
-
访问的规则
-
首先,先在自己的作用域内部查找,如果有,就拿来用
-
如果没有,就去上一级作用域查找,如果有,就拿来用
-
如果没有,就继续去上一级,以此类推
-
如果一直找到全局作用域都没有这个变量,就会报错(变量名 is not defined)
-
变量的访问规则 也叫 作用域 查找机制
-
作用域的查找机制只能向上找,不能向下找
-
var num1 = 100;function fn(){var num2 = 200;function fn1(){var num3 = 300;console.log(num3);//300 先在自己的作用域内部查找,如果有,就拿来用console.log(num2);//200 如果没有,就去上一级作用域查找,如果有,就拿来用console.log(num1);//100 如果没有,就继续去上一级,以此类推console.log(a);// a is not defined}fn1();}fn();
// 作用域的查找机制只能向上找,不能向下找function fn1(){var num = 100;}fn1();console.log(num);// 发现自己就是全局作用域,自己是全局的没有上一级了,直接报错
2.2 赋值规则
-
当你给一个变量赋值的时候,就先找到这个变量,在给他赋值
-
赋值规则
-
先在自己作用域内部查找,有就直接赋值
-
没有就去上一级作用域查找,有就赋值
-
还没有在去上一级,一次类推 有就直接赋值
-
function fn1(){var username = "张三";function fn2(){username = "李四";console.log(username); //李四}fn2();console.log(username);//李四
}
fn1();
-
如果一直找到全局作用域都没有,那么就把这个变量定义乘全局变量,在给他赋值
function fn2(){function fn3(){num = 100;}fn3();
}
fn2();
console.log(num); //100
三、递归函数 (难点) 了解
-
在编程里,递归就是一个自己调用自己的手段
-
递归函数:一个函数内部,调用了自己,循环往复
// 这是一个简单的递归函数,
// 在函数内部调用了自己,函数一执行,就调用自己一次,在调用在执行 不会停止!!!
// 会是一个死递归,类似循环 死递归 会爆栈
function box(){console.log("哈哈哈哈哈递归!!!");box();
}
box(); Maximum call stack size exceeded "超出最大调用堆栈大小"
-
所以 咱们只要写了递归,就需要停止, 通过
return停止这个return 就是递归的归
var count = 0;
function fn(num){count++;console.log("我是递归函数");if(count===10){return;}fn()
}
fn()
练习:使用递归求和 1-5的和??
// /练习:使用递归求和 1-5的和?? // 1- 5+fn(4)+fn(3)+fn(2)+fn(1)function fn(n){// 递归的归if(n==1){return 1}// 调用自己 fn()return fn(n-1) + n;}var res = fn(5);console.log(res);// 分析// 1、fn(5)-> 此时 n=5 if条件不成立 执行return fn(4) + 5;1+2+3+4+5// 2、fn(4)-> 此时 n=4 if条件不成立 执行return fn(3) + 4;1+2+3+4// 3、fn(3)-> 此时 n=3 if条件不成立 执行return fn(2) + 3;1+2+3// 4、fn(2)-> 此时 n=2 if条件不成立 执行return fn(1) + 2; ==>1+2// 5、fn(1)-> 此时 n=1 if条件成立了 返回1
四、对象
-
对象是一个复杂数据类型
-
也不是很复杂,只不过是存储了一些基本数据类型的一个集合
-
对象就是键值对 集合
var obj = {num:100,str:"hello",boo:true,username:"张三"
}
注意:对象{} 和函数{}是完全不一样
函数里写的是逻辑代码,,而对象里写的是一些数据!!!
4.1 对象的创建
-
字面量方式创建
// 先创建一个空对象
var obj = {};
obj.name = "Jack";
obj.age = 18;
obj['age'] = 19;
obj.address = "河南省商丘市";
console.log(obj);
-
内置的构造函数创建对象
// js内置的狗仔函数创建对象//parseInt("19.11px"); //19//js内置构造函数??? 其实也是函数 构造函数首字母大写// 构造函数需要 new 关键字去创建var obj = new Object();obj.username="嘿嘿嘿";obj.age = 19obj['address'] = "北京市海淀区"console.log(obj);
-
for in 可以遍历(循环)对象
// 如果想获取每一个键值对 就通过 for infor(var key in obj){console.log(key); // 获取到的键值对的 键名console.log(obj[key]); // 获取到的键值对的 值}
作业:
利用递归求100的阶乘 fn(n) = fn(n-1) *n
相关文章:
07_JavaScript函数作用域_递归
目录 一、作用域(重点) 二、变量的使用规则 (重点) 2.1 访问规则 2.2 赋值规则 三、递归函数 (难点) 了解 四、对象 4.1 对象的创建 一、作用域(重点) 什么是作用域 ? 作用…...
.gitignore使用指南
.gitignore使用指南 目录 什么是.gitignore为什么需要.gitignore如何创建.gitignore文件.gitignore文件的语法规则 忽略单个文件忽略目录忽略特定类型的文件不忽略特定文件或目录递归匹配 示例.gitignore文件注意事项更多特殊场景匹配规则 忽略多个特定后缀的文件忽略特定目录…...
Excel多级联动下拉菜单的自动化设置(使用Python中的openpyxl模块)
1 主要目的 在Excel中,经常会遇到需要制作多级联动下拉菜单的情况,要求单元格内填写的内容只能从指定的多个选项中进行选择,并且需要设置多级目录,其中下级目录的选项内容要根据上级目录的填写内容确定,如下图所示&am…...
深入解析 Spring Framework 5.1.8.RELEASE 的源码目录结构
深入解析 Spring Framework 5.1.8.RELEASE 的源码目录结构 1. 引言 Spring Framework 是 Java 领域最流行的企业级开发框架之一,广泛用于 Web 开发、微服务架构、数据访问等场景。本文将深入解析 Spring Framework 5.1.8.RELEASE 的源码目录结构,帮助开…...
excalidraw画图工具——背景画布有无格子设置
服啦找了大半天,愣是没找到 toggle grid : 切换格子… Excalidraw的背景格子 只要右键,将这个勾取消就好了?...
计算机组成原理———I\O系统精讲<1>
本篇文章主要介绍输入输出系统的发展概况 一.输入输出系统的发展概况 1.早期阶段 该阶段的特点是I/O设备与主存交换信息都必须通过CPU 当时的I/O设备有如下几个特点: (1)每个I\O设备都必须配有一套独立的逻辑电路与CPU相连,用来…...
[数据结构] 动态顺序表应用
可扩容顺序表顺序表 SeqList.hSeqList.cTest.c 动态顺序表能够根据数据存储的需要动态地管理内存空间。 SeqList.h #include<stdio.h> #include<stdlib.h>//静态顺序表 //小了不够用,多了浪费 //#define N 10 //typedef int SLDatatype; //struct SeqL…...
MinIO-对象存储方案
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。 MinIO是一个非常轻量的服务…...
装饰器模式 (Decorator Pattern)
装饰器模式 (Decorator Pattern) 是一种结构型设计模式,它动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。 一、基础 1 意图 动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰器模式相比生成子类更为灵活。 2 适用场景 当…...
手动配置树莓派wifi联网连接热点手机热点
手动配置树莓派wifi联网连接热点 修改wifi配置文件: 运行命令: sudo nano /etc/wpa_supplicant/wpa_supplicant.conf 在文件中添加无线网配置信息: ctrl_interfaceDIR/var/run/wpa_supplicant GROUPnetdev update_config1 countryCN network{ ssid”你的无线网名字” psk”…...
【学习笔记】麦肯锡《超级智能体:赋能人们释放人工智能的全部潜力》
麦肯锡《超级智能体:赋能人们释放人工智能的全部潜力》报告的学习笔记: 报告背景与意义 • 科技发展趋势:随着人工智能技术的飞速发展,其在各行业的应用逐渐深入,麦肯锡的这份报告正是基于这一背景,旨在深入…...
ENSP学习day9
ACL访问控制列表实验 ACL(Access Control List,访问控制列表)是一种用于控制用户或系统对资源(如文件、文件夹、网络等)访问权限的机制。通过ACL,系统管理员可以定义哪些用户或系统可以访问特定资源&#x…...
文章记单词 | 第2篇(六级)
一,单词释义 story:名词(n.)故事;小说;(真实情况的)叙述,描述;楼层(美语写法,英式英语为 storey)stress:名词…...
【C++动态规划 数学】1039. 多边形三角剖分的最低得分|2130
本文涉及知识点 C动态规划 数学 LeetCode1039. 多边形三角剖分的最低得分 你有一个凸的 n 边形,其每个顶点都有一个整数值。给定一个整数数组 values ,其中 values[i] 是第 i 个顶点的值(即 顺时针顺序 )。 假设将多边形 剖分 …...
5.go切片和map
切片的概念 数组和切片相比较切片的长度是不固定的,可以追加元素,在追加时可能会使切片的容量增大,所以可以将切片理解成 "动态数组",但是,它不是数组,而是构建在数组基础上的更高级的数据结构。…...
【Linux网络-多路转接select】
代码:https://gitee.com/nanyi-c/linux/tree/master/day50 一、I/O多路转接之select 1.初始select 系统提供select函数来实现多路复用输入/输出模型 select系统调用是用来让我们的程序监视多个文件描述符的状态变化的程序会停在select这里等待,直到被…...
cmd命令查看电脑的CPU、内存、存储量
目录 获取计算机硬件的相关信息的命令分别的功能结果展示结果说明获取计算机硬件的相关信息的命令 wmic cpu get name wmic memorychip get capacity wmic diskdrive get model,size,mediaType分别的功能 获取计算机中央处理器(CPU)的名称 获取计算机内存(RAM)芯片的容量…...
LVS的 NAT 模式实现 3 台RS的轮询访问
使用LVS的 NAT 模式实现 3 台RS的轮询访问 1.配置 RS(NAT模式)2. 配置 LVS 主机(仅主机、NAT模式)2.1 配置仅主机网卡(192.168.66.150/24 VIP )2.2 配置 NAT 网卡(192.168.88.6/24 DIPÿ…...
phpcms版AI自动发文插件,自动创作,自动配图,自动发布,支持多种大模型
phpcms版本的AI自动发文插件1.0.0版,支持自动写文章,自动配图,自动发布。目前支持DeepSeek,豆包,通义千问,文心一言,讯飞星火,KIMI,腾讯混元登大模型AI。同时有自定义字段…...
C语言判断闰年相关问题
一、简单闰年问题引入 写一个判断年份是否为闰年的程序? 运行结果: 二、闰年问题进阶 使用switch语句根据用户输入的年份和月份,判断该月份有多少天? 第一种写法(判断年份写在switch的case的里面): 运行结果: 第二种解法(先判断闰年): 运行结果: 三、补充 switch中的ca…...
团体协作项目总结Git
使用Git开放时候发现本地, 有些代码并没有被拉取到本地仓库, 又不想再commit一次, 这时候我就想到了 git commit --amend 合并提交 git commit --amend 修改git提交记录用法详解 可以将本次提交记录合并到上一次合并提交 git commit --amendgit rebase -i master^^ // 假设我…...
solana/web3.js 2.0:Solana 转账全流程解析
Solana 区块链以高吞吐量和低交易成本,已成为开发者的热门选择。而 solana /web3.js 2.0 作为最新一代 JavaScript 库,为与 Solana 网络交互提供了更高效、模块化的工具。本文将深入剖析如何使用 solana /web3.js 2.0 实现 Solana 区块链上的转账操作&am…...
数模转换电路(D/A转换器)
将数字信号转换成模拟信号称为数/模转换, 简称D/A(Digital to Analog)转换,实现 D/A 转换的器件称为D/A转换器,简称 DAC(Digital-Analog Converter)。 将模拟信号转换成数字信号称为模/数转换, 简称A/D&a…...
网络基础-路由器和交换机工作配置
三、路由器和交换机的工作原理配置以及华为体系下的小型网络的搭建 3.1路由基础 3.1.1数据转发 通过链路层交换机和网络层路由器进行数据转发 交换机(链路层)mac地址表的数据转发路由器(网络层) ip路由表的数据转发 隔离广播域…...
uv包简单使用案例
uv由Charlie Marsh开发,是Astral Tool的一个快速Python包安装器和解析器。它类似于pip和pip-tools,但速度更快。此外,uv还支持虚拟环境管理,替代venv和virtualenv。 参考:https://github.com/astral-sh/uv 安装&#x…...
PHP接口开发:从基础到高级的全面指南
一、接口基础与核心概念(约800字) 1.1 接口的本质定义 在PHP中,接口(Interface)是一种特殊的抽象结构,它通过interface关键字定义一组方法的契约规范,不包含具体实现。这种设计强制实现类必须遵循统一的调用标准,如: interface PaymentGateway {public function proc…...
JAVA学习*String类
String类 基本知识 String类的构造方法 String类的构造方法有很多,我们需要掌握常见的构造方法,来赋初识值。 1、new一个String类的对象 String name new String("张三");2、使用字符串常量进行赋值 String name "张三";相当…...
Java IO框架体系深度解析:从四基类到设计模式实践
Java IO框架体系深度解析:从四基类到设计模式实践 一、IO流体系架构总览 1.1 四基类设计哲学 Java IO框架以InputStream、OutputStream、Reader、Writer四个抽象类为根基,构建了完整的流式IO体系。这种设计体现了以下核心原则: 抽象分层&a…...
【读书笔记】华为《从偶然到必然》
note 华为的成功并非偶然,而是通过IPD体系、投资组合管理、平台战略等系统性工具,将研发投资转化为可持续的商业竞争力。书中强调的“管理即内部因素”理念,揭示了企业规模扩张与管理能力匹配的深层规律,为高科技企业提供了可借鉴…...
failed to load steamui.dll”错误:Steam用户的高频崩溃问题解析
当你满心欢喜地双击 Steam 图标,准备进入游戏世界时,屏幕上突然弹出 “failed to load steamui.dll” 的刺眼提示——这是全球数百万 Steam 用户最不愿见到的错误之一。作为 Steam 客户端的核心界面动态链接库文件,steamui.dll 的缺失或损坏会…...
