当前位置:网站首页>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
边栏推荐
猜你喜欢
最全总结Redis数据类型使用场景
03-npm安装包详解,解决npm下载慢的问题,引入nrm等
08-JS对象、原型及原型链
(1) Construction of a real-time performance monitoring platform (Grafana+Influxdb+Jmeter)
(3) How Redis performs stress testing
C语言结构体——位段概念的讲解
labelme工具,对类别标注,再进行细致的分割
08-Express路由详解
2021研究生数学建模D题,BP神经网络和卷积神经网络解题代码(基于pytorch)
pytorch安装笔记——Pytorch在conda+CUDA10.2环境安装task01
随机推荐
Chapter 13 Class Inheritance
C语言版——通讯录进阶(文件版本)
C语言的二维数组初始化的几种方式介绍(私藏大数组初始化方式)
Object.keys
第4章 复合类型-2(指针)
【记录】innerHeight?clientHeight?offsetHeight?scrollTop?screenTop?.....一堆高度傻傻分不清
C语言——文件操作函数 fseek、ftell、rewind详解
家·谱——人脸识别家谱系统
【备忘】于仕琪的libfacedetection相关
CSDN 社区内容创作规范
c 指针学习(1)
CSDN 社区内容创作规范
leetcode21.合并两个有序链表
Qt 字符串截取 查找字符串
task02 fashion-mnist分类实战
C语言——动态内存分配常见的错误案例
Some writing skills commonly used in Markdown
【win10+cuda7.5+cudnn6.0安装caffe③】编译及测试caffe
第10章 对象和类 -1
leetcode21. Merge two ordered linked lists