当前位置:网站首页>let 块级作用域
let 块级作用域
2022-08-11 05:17:00 【-加油】
1、var 和 let 函数作用域
function fun(){
let a = 10;
console.log(a);// 输出10
}
fun();// 函数执行结束后会被js回收机制回收
console.log(a);//报错
函数执行结束后变量会被js回收机制回收
报错
function fun(){
var a = 10;
console.log(a);
}
fun();// 函数执行结束后会被js回收机制回收
console.log(a);//出错
2、同一作用域不可重复声明
function fun(a){
// let a = 10 这里会报错 在同一作用域下不可重复声明
console.log(a);
}
fun(1)
不在同一作用域:
function fun(a){
{
let a = 10; // 块级作用域
console.log(a);// 先输出10
}
console.log(a);//再输出 1
}
fun(1)
3、if{}块作用域
if(1){
let a = 3;
{
let a = 10;
console.log(a);//10 它的块级作用域1
}
console.log(a);//3 它的块级作用域
}
console.log(a); // 报错
4、for的
在for(; ; ) {}循环中 (; ;)为父作用域,{}为子作用域
//父作用域的i
for(let i = 0;i<3;i++){
//这两个i分别是父作用域、子作用域的i
//没有重复声明
let i ='ES6';//子作用域的i
console.log(i);//会输出3个ES6
}
而使用var时:
//使用var,把i提升到全局变量
for(var i = 0;i<3;i++){
var i ='ES6';// 把循环的i覆盖了
//所以下次循环不满足i<3
console.log(i);//会输出1个ES6
}
使用let但没有赋值时:
for(let i = 0;i<3;i++){
let i ;// 子重新定义了 但没有赋值
console.log(i);//三次undefined
}
没有在子作用域定义时:
使用父作用域的:
for(let i = 0;i<3;i++){
//子作用域没有i可以使用父作用域的i
console.log(i);//会输出0 1 2
}
修改父作用域的:
for(let i = 0;i<3;i++){
//在子中 没有定义i 所以还是使用了父的i
//把 父的i的值修改了
i ='ES6';// 所以第二次循环时满足不了i<3
console.log(i);//会输出一个ES6
}
重复定义:
for(let i = 0;i<3;i++){
//在子中定义 var i ,var 会提升
// 这样就与父的let i冲突,造成for(let i)时的重复定义
var i ='ES6';
//Identifier 'i' has already been declared
console.log(i);//报错
}
5、
使用var:
var fun = [];
//var i 把i提升到全局上循环时用的都是同一个window.i
for(var i =0;i<3;i++){
//该函数定义时并没有执行
fun[i] = function(){
//i 父作用域 由于是var 是全局作用域 随时被覆盖
console.log(i);//当调用函数执行时 i已经被覆盖
}
}
console.log(i);//3
fun[0]();//3
fun[1]();//3
fun[2]();//3
for(var i=0;i<3;i++){
//for又把i覆盖了 所以调用函数时输出的i不一样了
fun[i]();// 输出 0 1 2
}
console.log(i);//3
使用let:
var fun = [];
for(let i =0;i<3;i++){
fun[i] = function(){
//i 使用的是父作用域的
console.log(i);
}
}
// console.log(i);//Error: i is not defined
fun[0]();//0
fun[1]();//1
fun[2]();//2
for(let i=0;i<3;i++){
fun[i]();// 输出 0 1 2
}
//console.log(i);//Error: i is not defined
var fun = [];
for(let i =0;i<3;i++){
fun[i] = function(){
//子作用域重新定义i
let i = '修改i'
console.log(i);
}
}
// console.log(i);//Error: i is not defined
fun[0]();//修改i
fun[1]();//修改i
fun[2]();//修改i
边栏推荐
- C - file operations fseek () function, ftell, rewind, rounding
- 05-JS中的BOM和DOM
- Chapter 5 Loops and Relational Expressions
- Error in render: “TypeError: Cannot read properties of undefined (reading ‘kingKongList‘)“
- vscode插件
- 吃瓜教程task01 第2章 模型评估与选择
- 09-ES6语法:变量、箭头函数、类语法、静态属性及非静态属性
- 组件间通信
- CSDN 社区内容创作规范
- (2) Docker installs Redis in practice (persistent AOF and RDB snapshots)
猜你喜欢
【win10+cuda7.5+cudnn6.0安装caffe②】安装Visual Studio 2013和caffe
Django--20 implements Redis support, context, and interaction of context and interface
pytorch安装笔记——Pytorch在conda+CUDA10.2环境安装task01
08-Express路由详解
C语言——文件操作(2)文件的读写操作
【CSDN21天学习挑战赛】第一天,配置环境外加实现mnist手写数字识别
分布式日志存储架构设计方案
Error in render: “TypeError: Cannot read properties of undefined (reading ‘kingKongList‘)“
简单做份西红柿炒蛋778
【win10+cuda7.5+cudnn6.0安装caffe⑥】报错及处理方式
随机推荐
C语言版通讯录——动态存储(进阶版)
内存泄露与内存溢出
【记录】ES6
C语言——动态内存分配常见的错误案例
Visual Studio上一些Error的解决方案
ES11新增数据类型BigInt大整型
C语言的二维数组初始化的几种方式介绍(私藏大数组初始化方式)
【win10+cuda7.5+cudnn6.0安装caffe④】安装pycaffe
vscode插件
【翻译】博客游戏项目Q1K3 – 制作
09-ES6语法:变量、箭头函数、类语法、静态属性及非静态属性
Blender 初教程
LeetCode43.字符串相乘 (大数相乘可用此方法)
leetcode21. Merge two ordered linked lists
C语言自定义数据类型——联合体
【win10+cuda7.5+cudnn6.0安装caffe⑥】报错及处理方式
C语言结构体——位段概念的讲解
C语言——程序的编译与执行、宏定义详解
Chapter 4 Composite Types-1
吃瓜教程task01 第1章 绪论