当前位置:网站首页>JS笔记1
JS笔记1
2022-07-17 00:14:00 【Object not found】
- 当元素没有设置宽高时,如何实现垂直居中显示?
①flex弹性布局
解释:父元素设置宽高大小,子元素不设置
<body><div><span>子元素</span></div></body>
<style>
//父元素增加弹性布局
div
{
display:flex;
width:80%;
height:500px;
flex-direction:row;//设置主轴的方向
justify-content:center;//主轴中子元素的排布方式
align-items:center;//侧轴上中子元素的排布方式
background:
}
div span
{
background:
}
</style>
②定位+transform
<body><div><span>子元素</span></div></body>
div
{
//演示时添加父元素宽高或者只加高度也可以
width:80%;
height:500px;
position:relative;
background:
}
div span
{
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
background:
}
③display:table和display:table-cell
注意:
1.display:table-cell会被float和position等属性破坏效果
2.table-cell指的是让标签元素以表格单位格的形式呈现,
vertical-align:用来指定行内元素或表格单位格元素的垂直对齐方式
<body><div><span>子元素</span></div></body>
div
{
//演示时添加父元素宽高或者只加高度也可以
width:80%;
height:500px;
display:table;
}
div span
{
display:table-cell;
//因为是行内元素对齐需要水平和垂直居中哦
vertical-align:middle;
text-align:center;
}
④:before和display:inline-block
<body><div><span>子元素</span></div></body>
div
{
//演示时添加父元素宽高或者只加高度也可以
width:80%;
height:500px;
text-align:center;
}
div::before{
content:””;
height:100%;
vertical-align:middle;
display:inline-block;
}
div span
{
display:inline-block;
}
- var、let、const的区别
- var
①可以跨块访问,不可跨函数访问
当调用函数时创建与赋值,调用后销毁
②如果省略var操作符,意为全局变量
注意:局部作用域中定义全局变量难维护,不推荐
在严格模式下,可能会抛出ReferenceError
③var支持预解析,变量提升(变量或函数声明提升到作用域顶部)
④var定义的全局变量可以挂载到window对象,使用window访问
- let
①只能在块作用域访问,不跨块、跨函数访问
②不能重复声明(冗余声明),只能声明一次
③不会变量提升,当创建后未完成语法绑定(声明),访问会抛出异常ReferenceError,变量到可以访问之间的时间称为暂时死区
④let在全局作用域中声明的变量不会成为window对象的属性
var name=”xx”;console.log(window.name);//xx
var age=18;console.log(window.age);//undefined
⑤for循环中的var、let声明(重要,异步)
- const
①定义常量,声明后一定要赋值(不赋值报错),定义后不可修改(修改报错)
声明对象时,修改对象内部属性不报错
原因:基本数据类型的值储存栈内存,应用数据类型储存栈区的是对象堆内地址,修改对象属性,不修改对象栈区地址,如果重新给对象赋值会报错
②for循环中不适用,循环中迭代变量(变量自增)
如果声明不修改的变量或每次迭代创建新变量,例如:for-in和for-of循环
var | let | const | |
块 | √ | √(只能在块区域) | √(只能在块区域) |
函数 | × | × | × |
声明 | 多次 | 一次 | 一次 |
声明赋值分开 | √(在局部作用域中,声明未var表示全局变量,不推荐) | √ | ×(声明后一定要赋值,否则异常) |
变量提升 | √ | ×(未语法绑定异常) | × |
是否挂载在window | √ | × | × |
for循环 | 全局变量,外部可调用,为最后一次结果 | 局部变量,不可调用 | 同let(如果变量不修改可使用) |
在for循环中var、let案例
for (var i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
// 答案5、5、5、5、5
for (let i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
// 答案0、1、2、3、4
原因:for循环中使用setTimeout异步机制,
①JS单线程环境
单线程指同一时间只能做一件事,所有任务需要排队。
②JS任务分为:同步任务和异步任务
异步任务图解

具体执行步骤如下:
- for循环同步任务执行,产生五个定时器(var是全局变量,遍历完成i=5)
- 同步任务遍历执行后再进行异步任务定时器,输出5个5
- 而let声明变量不是全局变量,for循环成为一个单独的作用域,作用与闭包形成块级作用相同,因此输出0-4
补充:
①for(var i=0;i<5;i++)
{
setTimeout(function(){},console.log(i),i*1000,i);//0,1,2,3,4
}
For(var i=0;i<5;i++)
{
setTimeout(function(){console.log(i);}i*1000);
}
这个问题涉及到console.log与console.log()区别
使用eval()方法,发现console.log是字符串,而console.log()不是
eval(str),接受一个字符串作为参数,如果返回是一个值就返回该值,否则返回undefined
console.log是function函数名,console.log()是同步任务跟for同时执行
而setTimeout()会判断第一个参数是否为function,如果是执行异步任务,不是会当字符串处理,因此console.log(i)会被当作字符串处理(setTimeout里没有回调函数),因此相当于与for循环同步执行操作
补充如果想输出顺序,可以使用let,但是ES6中只支持现代浏览器,考虑兼容推荐使用闭包
或者
①利用setTimeout第三个参数,将i作为参数传递
for(var i=0;i<5;i++)
{
setTimeout(function(i)
{
console.log(i)
},1000,i)
}
②使用IIFE(立即执行的匿名函数)闭包
for(var i=0;i<5;i++)
{
(function(i)
{
setTimeout(function(){
console.log(i)
},1000)
})(i)
}
③立即执行函数
for(var i=0;i<5;i++)
{
(function(i){
setTimeout(function(){
console.log(i);
},1000);
})(i);
}
个人笔记,如有错漏之处,敬请指正
边栏推荐
- Install websocketpp
- 【解决方案】win11中本地组策略编辑器(gpedit.msc)打不开
- ENVI:(2022年最详细的教程)自定义坐标系
- LeetCode:动态规划【基础题目求解】
- 【Unity编辑器扩展】Unity内部Asset资源配置ScriptableObject
- ENVI_ Idl: read the text file and output it in GeoTIFF format + simple mean interpolation
- 搭建Ozzie环境
- BladeX——精心设计的微服务架构
- Gdb+vscode for debugging 4 - GDB executes relevant commands
- ENVI_ Idl: batch process the re projection of MODIS swath data and output it to GeoTIFF format + detailed analysis
猜你喜欢

Aurix development studio installation

第2章-系统控制原理 -> 经典控制理论

Dueling DQN的理论基础及其代码实现【Pytorch + Pendulum-v0】

成信大ENVI_IDL第一周实验测试:数组的简单运算+详细解析

【Unity编辑器扩展】Unity资产预处理和后处理图片自动转Sprite2D

Gdb+vscode for debugging 3 - vscode and GDB remote debugging

Memory pooling of pooled components

捉虱子的博弈论

Swagger——世界上最流行的Api框架

ENVI_ Idl: read the NO2 column content of all OMI products and calculate the monthly average, quarterly average, annual average + analysis
随机推荐
在Oozie中配置 map-reduce workflow
Oozie integrated sqoop
Prohibit smart Safari from playing automatically when opening a web page
Gdb+vscode for debugging 7 - how to debug when there is a segmentation default/ segment error in the program?
【Unity开发小技巧】Unity混音器Mixer控制全局音量
(附word操作以及视频讲解)使用ARCGIS进行地图配准_投影变换_普通地图制作_专题地图制作
搭建Sqoop环境
LeetCode:动态规划中的子序列问题
Gdb+vscode for debugging 3 - vscode and GDB remote debugging
简述特征工程及其sklearn的实现
windows安装mysql和jdbc
ENVI_IDL: 文本文件的读取(主要是txt、csv文件)
LeetCode:动态规划中的多重背包问题【一个模板解决所有~】
【解决方案】win11中本地组策略编辑器(gpedit.msc)打不开
字符串全排列问题
STL--stack容器
Build spark on yarn environment
【Unity编辑器扩展】快速定位资源和脚本的指定文件和路径
STL--deque容器
CMake常用命令