js小知识点(二)
一、html中加载动态时间
<body onload = "showtime()">
<script>
function showtime(){
var date = new Date(); //日期对象
var time = date.getHours() + ":"+date.getMinutes()+":"+date.getSeconds();
console.log(time);
document.getElementsByClassName("timeNow")[0].innerHTML = time;
setTimeout("showtime()",1000);
}
</script>
二、我们常用的前进或者返回箭头
❮
❯
三、js声明变量时使用var和不使用var以及let区别
Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的。可以正常运行的代码并不代表是合适的代码。
var num = 1;
是在当前域中声明变量. 如果在方法中声明,则为局部变量(local variable);如果是在全局域中声明,则为全局变量。
而 num = 1;
事实上是对属性赋值操作。首先,它会尝试在当前作用域链(如在方法中声明,则当前作用域链代表全局作用域和方法局部作用域etc。。。)中解析 num; 如果在任何当前作用域链中找到num,则会执行对num属性赋值; 如果没有找到num,它才会在全局对象(即当前作用域链的最顶层对象,如window对象)中创造num属性并赋值。
注意!它并不是声明了一个全局变量,而是创建了一个全局对象的属性。
即便如此,可能你还是很难明白“变量声明”跟“创建对象属性”在这里的区别。事实上,Javascript的变量声明、创建属性以及每个Javascript中的每个属性都有一定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。
由于变量声明自带不可删除属性,比较var num = 1 跟 num = 1,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除。
关于let的文章
https://www.cnblogs.com/fly_dragon/p/8669057.html
例子:
// i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被固定,不受外界干扰。
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i); // i 是循环体内局部作用域,不受外界影响。
}, 0);
}
// 输出结果:
0 1 2 3 4 5 6 7 8 9
四、for循环中setTimeout问题
for (var i = 0; i <= 3; i++) {
setTimeout(function () {
console.log(i);
},0);
}
for (var i = 0; i <= 3; i++) {
setTimeout(function (a) {
console.log(a);
}(i),0);
}
输出,会是第二个for循环先输出
0
1
2
3
之后是第一个for循环输出
4
4
4
4
原因:
1.setTimeout绑定的回调函数只是往Javascript的事件循环机制中注册了一个定时器,这个定时器只可能在当前时间循环的下一次事件循环中才有可能被执行(需要检查时间是否符合设置的时间点)
而setTimeout延迟0并不代表你使用了setTimeout之后0秒就立即执行了,如果0秒立即执行,那么会先执行setTimeout设置的延迟0所应该调用的函数然后才继续执行下面的代码,而此处0是指设定一个任务,当现有的任务执行完了之后延迟0(若有设置时间则延迟相应的时间)开始执行,所以此处会先执行完现有的代码之后才会执行所谓的延迟0的那个该调用的函数
function (a) {
console.log(a);
}(i)
是一个立即执行函数,在你setTimeout函数执行调用时就被执行了,而不是等到定时器到点后被执行
3.setTimeout(fn,0)并不是立即执行的语义,只是说在下一次时间循环到达时可以马上执行
4.打印4次4的问题
for (var i = 0; i <= 3; i++) {
setTimeout(function () {
console.log(i);
},0);
}
等价==>
var i;//a
for (i = 0; i <= 3; i++) {
setTimeout(function () {
console.log(i);
},0);
}
输出4次4是因为javacript没有块作用域,只有函数作用域,一个函数在定义时其中俄变量的作用域就确定;函数中变量i的指向的a处声明的变量,在for循环结束后i的值就是4并且你定义了4个同样的定时器
五、变量提升
JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
var声明的初始化也不会提升哦!
当然上面的两句话仅仅适用于(var)
不适用于let
六、上传大文件
采用切片方法,后端接收后再组装
https://juejin.im/post/5cf765275188257c6b51775f
上一篇: 深入理解PHP7内核之Reference