[toc]
### 1. let 有块级作用域, var 没有
```js
{
var a = 10;
let b = 20;
}
console.log(a); // 10
console.log(b); // b is not defined 报错
```
### 2. var 在同一个作用域中可以重复声明,let 不可以
### 3. var 存在声明提前,let 不可以
### 4. for 循环中的 var 与 let
1) for中var i会对外界产生影响
```
for(var i=1; i<5; i++){
console.log(i); //1, 2, 3, 4
}
console.log(i); //5
```
for中let i的作用域仅限for循环内
```
for(let i=1; i<5; i++){
console.log(i); //1, 2, 3, 4
}
console.log(i); //i is not defined
```
2) for中var i中会覆盖外界上层的声明
```js
var i = 3;
for(let i=1; i<5; i++){
console.log(i); //1, 2, 3, 4
}
console.log(i); //5
```
3) 用var声明的for循环会跳过点击事件,当点击事件执行的时候,i返回for循环最后得出的值
```
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
var lis = document.getElementsByTagName("li");
for(var i=0; i<lis.length; i++){
lis[i].onclick = function(){
// lis[i].style.color = "red"; //无法执行,因为没有lis[3]
//改成this.style.color = "red"可以执行
console.log(i); //i=3
}
console.log(i); //0, 1, 2
}
</script>
```
4) let会正常执行
```
var lis = document.getElementsByTagName("li");
for(let i=0; i<lis.length; i++){
lis[i].onclick = function(){
// lis[i].style.color = "red"; //可以正常执行, lis[i]返回点击的i值
console.log(i);
}
console.log(i);
}
```
```
var num1 = 55;
var num2 = 66;
function f1(num, num1) {
num = 100; //此时传入的55变为100
num1 = 100; //此时传入的66变为100
num2 = 100; //该函数内没有num2,因此var num2 = 100覆盖了全局变量num2变为100
console.log(num); //100
console.log(num1); //100
console.log(num2); //100,只有外界的全局变量num2受到函数的影响
}
f1(num1, num2); //传入55, 66
console.log(num1); //55
console.log(num2); //100
console.log(num); //报错,而不是undefined
```
- JavaScript
- 1. DOM事件流
- 2. 模拟 new, Object create(), bind
- 5. 封装函数进行字符串驼峰命名的转换
- 6. 什么是promise
- 7. 判断一个数是否为数组
- 10. __proto__和prototype以及原型,原型链,构造函数
- 11. 继承
- 12. 闭包
- 13. 回调函数
- 14. var 和 let 区别
- 15. this、bind、call、apply
- 16.undefined和null的区别
- 17.内存泄漏
- 18.垃圾回收机制
- html css
- 1. 元素垂直水平居中
- 2. 清除浮动
- 3. bootstrap栅格系统
- 4. px rpx em rem vw 的区别
- 5. 两种盒子模型
- 6. 合集
- web类
- 1. html5的新特性以及理解(web标签语义化)
- 2. 什么是路由,关于前端路由和后端路由
- 3. 对优质代码的理解
- 4. cookie 和 sessionStorage和localStorage
- 5. 浏览器内核
- 6. http 状态码
- 7. href 和 src 的区别
- 8. link 和 @import 的区别
- 9. http 状态码
- 10. websocket
- 11. 浏览器解析url
- 12.http缓存
- vue
- 1.vue2和vue3有哪些区别
- 1. 对 mvvvm 的理解
- 2. mvvm的优缺点
- 3. 数据双向绑定的原理
- 4. 生命周期
- 5. 组件如何通信
- 6. computed和watch的区别
- 7. proxy 和 Object.defineProperty
- 8. 虚拟dom和 diff算法
- 9. 路由的嵌套与传参
- 10. 路由导航钩子
- 11. axios 的理解
- 12. vue自定义指令 diretive
- 13. diff 的实现
- 14. 实现一个简单的双向绑定
- 15. 为什么 data 是一个函数
- 题谱
- js
- 手写篇
- css
- vue
- react
- 算法
- 自我介绍
- 八股文
- 源项目地址
- 1.计算机网络
- 2.浏览器
- 3.html和css
- 4.javascript
- 6.typescript
- 7.vue
- 8.react
- 大厂面试
- 面试题大全
- 常见性能优化
- 面试实战
- 面试分析
- 押题
- 1.微前端在项目中的实际应用
- 2.性能优化
- vue相关
- 1.说一说HashRouter和HistoryRouter的区别和原理
- 无敌之路,牛客网面试题自测记录
- 前端基础
- 1.html
- 2.js基础
- 珠峰性能优化
- WebWorker
- url到渲染
- 浏览器加载机制
- 自我介绍1
- 手写题
- 1.compose
- 2.setTimeout模拟setInterval
- 3.手写数组拍平
- 4.手写promise.all
- 5.手写深拷贝
- webpack
- 实战