重要知识点:每节博客都会重复🙉🙉🙉
口诀🤨:四基两空一对象,还有五个falsy值。
七种数据类型
- number string bool symbol
- null undefined
- object
五个 falsy 值
- null undefined
- 0 NaN
- '' (空字符串)
前言
JS函数在执行的时候,函数所处的位置不同,执行的结果就会各不相同。
下面我们通过几个例子来看一下,函数的执行时机对结果会产生怎样的影响。
正文
例1
let a = 1
function fn(){
console.log(a)
}
唐僧: 徒儿,请问上例会打印出多少?
悟空:不知道,因为你压根没有调用函数fn。
例2
let a = 1
function fn(){
console.log(a)
}
fn()
唐僧: 徒儿,请问上例会打印出多少?
八戒:很显然,是1。
例3
let a = 1
function fn(){
console.log(a)
}
a = 2
fn()
唐僧: 徒儿,请问上例会打印出多少?
沙僧:因为fn在a=2后执行,故打印出2。
例4
let a = 1
function fn(){
console.log(a)
}
fn()
a = 2
唐僧: 徒儿,请问上例会打印出多少?
白龙马:对比一下例3我们可以知道,fn先调用的,故会打印出1。
前面几个例子都比较简单,相信大家都可以回答出来。那么我们现在升级一下难度,请看下面这个:
猛料
所谓时机不同,结果不同~
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
//结果输出6个6
for循环在主线程内,setTimeout是异步方法,在任务队列里面,只有主线程执行完后,任务队列才执行,当for执行结束时候,此时的i值已经是6,所以得到结果是个6。 那么如何输出0-5呢。
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
这是JS后来为新人开发者改变的一个东西。让代码按着新人的思路来实现。 出了上面这种方法能够实现打印0-5 那么还有其他方法吗?
可以通过自执行函数来实现
for (var i = 0; i <= 5; i++) {
!(function (j) {
setTimeout(function print() {
console.log(j);
}, 0);
})(i);
}
- 通过setTimeout第三个参数
for (var i = 0; i < 6; i++) {
setTimeout((i) => console.log(i), 0, i);
}
本文参考: 文章:我用了两个月的时间才理解 let
由于本人水平有限,如有描述不准确的地方请给我留言,欢迎交流~
本文为个人原创,转载请注明出处。