JS自定义函数(2)

1. 变量的作用域

全局变量

  • 定义:在函数外声明的变量

  • 作用范围:在整个JS文档中生效

  • 生命周期:页面关闭时销毁

局部变量

  • 定义:在函数内用 var 声明的变量

  • 作用范围:只能在函数内部使用

  • 生命周期:函数执行完毕时销毁

作用域规则

1.1 全局变局部
  • 全局变量可以在函数内部的任意位置使用

1.2 局部变全局
  • 局部变量不能在全局使用

  • 两种方法在全局使用局部变量:

    1. 去除 var 关键字(隐式全局变量,不推荐)

    2. 使用 return 返回变量值

块级作用域(ES6新增)

  • let 和 const 声明的变量具有块级作用域

  • 只在声明它们的 {} 内有效

2. 作用域链

概念

  • 函数中如果在当前作用域中没有查到值,就会向上级作用域去查

  • 直到查到全局作用域,这样形成的链条就叫做作用域链

特点

  • 内部环境可以通过作用域链访问所有外部环境

  • 外部环境不能访问内部环境的任何变量和函数

示例分析

var n = 10;
function outer(){function inner(){function center(){console.log(n); // 输出 undefined}center();}inner();var n = 15; // 变量提升,但赋值在console之后
}
outer();

3. 预解析(变量提升)

执行过程

  1. 预解析阶段:提前加载所有 var 和 function

  2. 代码执行阶段:按书写顺序执行

预解析规则

  • var:只声明不定义(值为 undefined

  • function:既声明又定义(包含函数体)

  • 函数优先级高于变量

  • 预解析只发生在当前作用域下

优先级顺序

  1. 函数声明(最高优先级)

  2. 变量声明

  3. 代码执行

4. 案例分析

案例1

var num = 10;
fun();
function fun(){console.log(num); // undefinedvar num = 20;
}

案例2

var num = 10;
function fun() {console.log(num); // undefinedvar num = 20;console.log(num); // 20
}
fun();

案例3

var a = 18;
f1();
function f1() {var b = 9;console.log(a); // undefinedconsole.log(b); // 9var a = 13;
}

案例4

console.log(a, b, c); // undefined undefined undefined
var a = b = c = 5; // b和c成为隐式全局变量

案例5

f1();
console.log(c); // 9
console.log(b); // 9
console.log(a); // 报错
function f1() {var a = b = c = 9; // 只有a是局部变量console.log(a); // 9console.log(b); // 9console.log(c); // 9
}

案例6

fn(); // 报错
var fn = function(){console.log(11);
}

案例7

function fn(){console.log(a); // 报错a = 100;
}
fn();
console.log(a);

案例8

console.log(show); // function show
function show(){console.log(123);
}
var show = 10;

案例9

function show(){console.log(123);
}
var show = 10;
console.log(show); // 10

5. 重要概念总结

变量提升等价代码

// 原始代码
console.log(a);
var a = 'hello';
function a(){console.log(123);
}// 提升后等价代码
function a(){console.log(123);
}
// var a; // 被忽略
console.log(a); // function a
a = 'hello';

作用域链案例

var a = 1
function fn1(){function fn2(){console.log(a) // 输出2}function fn3(){var a = 4fn2()}var a = 2return fn3
}
var fn = fn1()
fn()

6. 最佳实践

  1. 使用 let/const 代替 var

  2. 避免隐式全局变量

  3. 函数优先使用函数表达式

  4. 启用严格模式 "use strict"

  5. 变量声明放在作用域顶部

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

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

相关文章

【数据集】Argoverse 数据集:自动驾驶研究的强大基石

Argoverse数据集:自动驾驶研究的强大基石 在自动驾驶技术蓬勃发展的当下,高质量的数据集对于推动相关算法研究和模型训练起着举足轻重的作用。Argoverse 数据集便是其中的佼佼者,它为自动驾驶领域的众多任务提供了丰富且优质的数据资源。 一、…

--- 哈希表和哈希冲突 ---

哈希(散列)方法是对插入的数据通过哈希函数计算出一个哈希地值,并将这个哈希地址作为储存改数据的地址,这样下次再查找这个数据时,只需要通过哈希函数再获取到该地址然后直接去拿就好这样就做到了不经过任何比较&#…

数学建模-评价类问题-优劣解距离法(TOPSIS)

1-AI带你认识TOPSIS📘 一、TOPSIS 方法简介1. ​​基本定义:​​​​TOPSIS(Technique for Order Preference by Similarity to an Ideal Solution)​​,中文通常称为:•​​优劣解距离法​​•​​逼近理想…

Go协程:从汇编视角揭秘实现奥秘

🚀 Go协程:从汇编视角揭秘实现奥秘 #Go语言 #协程原理 #并发编程 #底层实现 引用: 关于 Go 协同程序(Coroutines 协程)、Go 汇编及一些注意事项。 🌟 前言:重新定义并发编程范式 在当今高并发…

MySQL 事务(重点)

MySQL 这个东西注定是可能会被多个用户/客户端来同时访问的,这是肯定的,MySQL 中存放的都是数据,数据可能有一个上层线程在用,也有可能另一个线程也要用...数据是被所有人共享的,所以就注定了 MySQL 这样的服务在一个时…

uniapp:h5链接拉起支付宝支付

场景:APP内点击支付宝支付,后台返回类似链接https://qr.alipay.com/bax***********c3050 通常做法是,使用plus.runtime.openURL(deeplink);先打开浏览器,浏览器会提示打开支付宝,之后是支付流程。现在可以省略跳转h5的…

吴恩达 Machine Learning(Class 3)

Week 11.1 K-means Cluster centroidK-means 是无监督学习中聚类算法的一种,核心在于更新聚类质心;首先将每个点分配给几个聚类质心,取决于那些点离哪个质心更近;然后将几个聚类质心移动到分配给他的所有点的平均值,不…

MyBatis 动态查询语句详解:让 SQL 更灵活可控

MyBatis 动态查询语句详解:让 SQL 更灵活可控 在日常的数据库操作中,我们经常会遇到需要根据不同条件拼接 SQL 语句的场景。比如查询用户时,可能需要根据姓名、年龄、性别等多个条件进行筛选,而这些条件往往是动态变化的 —— 有时…

Java基础语法three

一、一维数组一维数组初始化数据类型[] 数组名new 数据类型[数组长度]//动态初始化数据类型[] 数组名new 数据类型[]{值}//静态初始化数据类型[] 数组名{值}数组长度一旦确定,就不可更改。数组是序排序;数组属于引用数据类型的变量,数组的元素…

【数据结构】排序算法全解析:概念与接口

1.排序的概念及其运用 1.1 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的…

在 CentOS 7 上使用 LAMP 架构部署 WordPress

CentOS 7 LAMP 架构部署 WordPress全步骤本文将详细介绍如何在 CentOS 7 系统上通过 LAMP(Linux Apache MariaDB PHP)架构部署 WordPress 博客平台。 在CentOS 7上基于LAMP架构部署WordPress 一、系统基础配置 1. 修改主机名(本机IP&#…

Node.js导入MongoDB具体操作

在Node.js应用程序中,导入MongoDB是一项常见任务。本文将详细介绍如何在Node.js中连接和操作MongoDB数据库,包括安装必要的包、配置连接、执行基本的CRUD操作等步骤。1. 安装必要的包首先,确保你已经安装了Node.js和npm。然后,通过…

HTML--pre标签的作用

原文网址&#xff1a;HTML--pre标签的作用-CSDN博客 简介 本文介绍HTML里pre标签的作用。 <pre> 元素表示预定义格式文本。里边的文本会保留原格式&#xff0c;以等宽字体的形式展现出来&#xff0c;文本中的空白符&#xff08;比如空格和换行符&#xff09;都会显示出…

机器学习--数据预处理

目录 一、数据清洗&#xff1a;让数据纯净如新 1、缺失值处理&#xff1a; 2、异常值处理 3、重复值处理 二、数据变换&#xff1a;重塑数据的 “形状” 1、归一化 2、标准化 三、总结与展望 机器学习小白必看&#xff1a;数据预处理实战笔记 最近投身于机器学习的学习…

Python 数据可视化:Matplotlib 与 Seaborn 实战

Python 数据可视化&#xff1a;Matplotlib 与 Seaborn 实战​​​​在当今数据驱动的时代&#xff0c;数据可视化成为了理解和传达数据信息的关键手段。Python 作为一门强大的编程语言&#xff0c;拥有丰富的数据可视化库&#xff0c;其中 Matplotlib 和 Seaborn 尤为突出。本文…

计算机网络技术学习-day4《路由器配置》

目录 一、路由器基础认知 1. 路由器的核心功能 2. 路由器与交换机的区别 二、路由器配置基础操作 1. CLI&#xff08;命令行界面&#xff09;模式体系 2. 基础配置命令示例 &#xff08;1&#xff09;基础信息配置 &#xff08;2&#xff09;接口IP地址配置&#xff08;…

IDEA(十四) IntelliJ Idea 常用快捷键(Mac)

目录准备&#xff1a;Mac键盘符号和修饰键说明一、编辑类快捷键二、Search/Replace&#xff08;查询/替换&#xff09;三、编译、运行四、debug 调试五、Navigation&#xff08;导航&#xff09;六、Refactoring&#xff08;重构&#xff09;七、VCS/Local History八、Live Tem…

八月月报丨MaxKB在教育及教学科研领域的应用进展

在2025年5月的“MaxKB用户应用月度报告”中&#xff0c;我们对MaxKB开源智能体平台在教育行业的典型应用场景进行了总结。MaxKB在教育行业的应用主要集中在教学辅助、学术研究、校园服务、行政办公、财务管理、招生等场景。 目前&#xff0c;“DeepSeekMaxKB”的组合正在被包括…

一周学会Matplotlib3 Python 数据可视化-绘制自相关图

锋哥原创的Matplotlib3 Python数据可视化视频教程&#xff1a; 2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程讲解利用python进行数据可视化 科研绘图-Matplotlib&#xff0c;学习Matplotlib图形参数基本设置&…

第三十三天(信号量)

非常非常非常.....的重要在共享内存的代码里面p1.c实质是有问题lt._flag 1;//这里先置1if(c Q)sprintf(lt._buf,"quit");elsesprintf(lt._buf,"大家好&#xff0c;%d 我系渣渣辉. %d 是兄弟就来砍我吧!!! %d",i,i1,i2);while(*((int *)shmptr));//如果别…