前端基础 JS篇04

432 阅读3分钟

这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

前言

之前都是忙于业务开发,对前端的基本知识都是用到什么查什么,很少有时间沉下心来自己归纳,总结下基础,有时候,用到什么,觉得值得留意一下的东西,也都是自己笔记里记录下,也不怎么及时整理,然后随着时间的推移,陆陆续续记录的东西都是乱七八糟的,都没整理过,这次,写这个前端的基础系列,整理一下

打算以轻松,闲谈的调调来聊聊,文笔不好,大家将就的看

快速回顾

上文讲了

  1. JS中的this.指向的窗体window 2.this的bind方法

== 和 === 差别

这个平时开发中,用的还是挺多的

对于 == 来说,如果对比双方的类型不一样的话,就会进行类型转换,这也就用到了我们上一章节讲的内容。

假如我们需要对比 x 和 y 是否相同,就会进行如下判断流程:

  1. 首先会判断两者类型是否相同。相同的话就是比大小了
  2. 类型不相同的话,那么就会进行类型转换
  3. 会先判断是否在对比 null 和 undefined,是的话就会返回 true
  4. 判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number
1 == '1'1 == 1
  1. 判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断
'1' == true'1' == 11 == 1
  1. 判断其中一方是否为 object 且另一方为 stringnumber 或者 symbol,是的话就会把 object 转为原始类型再进行判断
'1' == { name: 'aaa' } 
              ↓ 
'1' == '[object Object]'

对于 === 来说就简单多了,就是判断两者类型和值是否相同。

闭包

这家伙,算是一块老骨头了,我们也来好好重新认识下它

闭包的定义其实很简单:函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包。

function A() { 
    let a = 1 
    window.B = function () { 
        console.log(a) 
    } 
} 

A() 

B() // 1

很多人对于闭包的解释可能是函数嵌套了函数,然后返回一个函数。其实这个解释是不完整的,就比如我上面这个例子就可以反驳这个观点。

在 JS 中,闭包存在的意义就是让我们可以间接访问函数内部的变量。

经典面试题,循环中使用闭包解决 `var` 定义函数的问题
for (var i = 1; i <= 5; i++) { 
    setTimeout(function timer() { 
        console.log(i) 
    }, i * 1000) 
}
    

首先因为 setTimeout 是个异步函数,所以会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6。

解决办法有三种,第一种是使用闭包的方式

for (var i = 1; i <= 5; i++) { 
    ;(function(j) {
        setTimeout(function timer() { 
            console.log(j) 
        }, j * 1000) 
    })(i) 
}

在上述代码中,我们首先使用了立即执行函数将 i 传入函数内部,这个时候值就被固定在了参数 j上面不会改变,当下次执行 timer 这个闭包的时候,就可以使用外部函数的变量 j,从而达到目的。

第二种就是使用 setTimeout 的第三个参数,这个参数会被当成 timer 函数的参数传入。

for (var i = 1; i <= 5; i++) { 
    setTimeout( function timer(j) { 
        console.log(j)
    }, i * 1000, i )
}

第三种就是使用 let 定义 i 了来解决问题了,这个也是最为推荐的方式

for (let i = 1; i <= 5; i++) { 
    setTimeout(function timer() { 
        console.log(i) 
    }, i * 1000)
}

总结

  1. 讲解== 和 ===
  2. 讲解闭包

ps: 干巴巴的文字讲了还是比较枯燥,并且难以印象深刻的,大家还是日常使用中,多多体会