视频链接:

JavaScript var let const的区别 - Web前端工程师面试题讲解

参考链接:

JavaScript 变量

JavaScript Let

JavaScript Const

练习网站:

codepen.io

初步认识:

功能实现

HTML的部分:

<input type="text" placeholder="帕图纳克斯">
<button>发表评论</button>
<div></div>

JS的部分:

//首先要要我想弄一个评论功能,
//通过document.querySelector获取到HTML中input标签的type属性为"text"的输入框的部分
//于是赋值给这个var变量text,该变量就成类似容器一样的存在
var text = document.querySelector("input[type='text']");
var button = document.querySelector("button");
var div = document.querySelector("div"); button.onclick = function(){
//用var创建变量content,把输入的内容赋值给content
var content = text.value;
//接着就把内容赋值给下面的评论显示区域
div.innerText = content;
};

现在我输入内容就显示出评论的结果了:

重复声明

在不新增变量以及不该写整体结构的前提下,我们可以利用var变量可以重复声明的性质,改写原来评论输入的内容:

JS部分改写:

var text = document.querySelector("input[type='text']");
var button = document.querySelector("button");
var div = document.querySelector("div"); button.onclick = function(){
var content = text.value;
var content = "下次一定";
div.innerText = content;
};

值的修改

而 如果我们不声明 var 这个变量,直接赋值就叫值的修改:

button.onclick = function(){
var content = text.value;
content = "下次一定";
div.innerText = content;
};

当我们使用let变量时,想重复定义是不可以的,但是可以进行值的修改或者创建一个新的let变量

const变量则更加严格,即不能重复定义,也不存在值修改,但是可以创建一个数组,利用数组通过指针指向和被引用的特点,来存新的变量达到我们修改评论的目的,例子如下。

JS的部分:

button.onclick = function(){
const content = [];
content[0] = text.value;
content[1] = "下次一定";
div.innerText = content[1];
};

声明提升

接下来弄一个新的例子来说明

HTML部分:

<p class="p1">听君一席话</p>
<p class="p2"></p>

JS部分:

var p1 = document.querySelector("p.p1");
var p2 = document.querySelector("p.p2"); p2.innerText=content; var content = "如听一席话"

之所以p2的类没有显示内容,则是因为var变量可以声明提示,类似如下的效果:

var content

p2.innerText=content;

content = "如听一席话"

此外let、const声明的变量是没有声明提升,但是可以利用值的修改可令let声明的变量不报错。

创建块级作用域

就是弄个函数,一个函数尽管使用了函数外的同名变量,但是可以选择是否调用,来达到改变该案例p2段落的情况。

不过这样太麻烦了,其实用let/const+花括号内容括起来就可以形成块级作用域的效果:

循环

注意:ES6之前的循环不算是块级作用域的一种

以下就弄也给循环案例

HTML部分:

<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>

JS部分:

var li = document.querySelectorAll("li");
//这里进行5次循环
for(var i=0;i<5;i++){
//每次循环都为li元素添加鼠标事件
li[i].onmouseover = function(){
//在这个监听事件,就添加文本节点用循环里的i赋值
var text = document.createTextNode(i);
this.appendChild(text);
//并且修改li元素的高度
this.style.height = i * 10 + "px";
}
}

鼠标逐个移动每个li,可以看到它们的间距确实变大了,但是变大的间距都是一致的,并不是逐个上升的,这里是回调函数的问题。

该函数的具体实现流程如下:

首先鼠标事件里的内容是回调函数

需要等执行栈里面的正常任务执行以后才会执行任务队列里面的回调函数的结果,var关键字没有形成块级作用域,回调函数只保存了参数i,等正常任务执行后,i就为5了。

可以在循环声明一个新的let变量j,把i的数值赋给j,并且令鼠标事件只认j,这样因为块级作用域的关系,每次迭代可以进行重新绑定,这样就可以使任务队列里面的回调函数都有不一样的i

var li = document.querySelectorAll("li");

for(var i=0;i<5;i++){
let j=i;
li[j].onmouseover = function(){
var text = document.createTextNode(j);
this.appendChild(text);
this.style.height = i * 10 + "px";
}
}



可以看到现在就达到我们希望可以逐个增大的效果了

当然也可以把块级作用域锁定在循环里面达到同样的效果(我测试不成功,不知道为什么i参数的0与1总是重合

JS修改:

var li = document.querySelectorAll("li");

for(let i=0;i<5;i++){
li[i].onmouseover = function(){
var text = document.createTextNode(i);
this.appendChild(text);
this.style.height = i * 10 + "px";
}
}

总结:

【前端面试】(四)JavaScript var let const的区别的更多相关文章

  1. web前端面试第一次[javascript函数和方法的区别]

    //函数 function f1(){ console.log("我是函数"); } //调用函数 f1(); //创建一个空对象 var obj = {} //把函数定义到对象里 ...

  2. 前端面试之JavaScript中数组的方法!【残缺版!!】

    前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...

  3. 前端面试之JavaScript中的闭包!

    前端面试之JavaScript中的闭包! 闭包 闭包( closure )指有权访问另一个函数作用域中变量的函数. ----- JavaScript 高级程序设计 闭包其实可以理解为是一个函数 简单理 ...

  4. 前端面试之JavaScript的基本数据类型!

    前端面试之JavaScript的基本数据类型! JS的基本数据类型 数字 字符串 布尔值 JavaScript中有两个特殊的原始值: null (空) 和undefined (未定义), , 它们不是 ...

  5. JavaScript var, let, const difference All In One

    JavaScript var, let, const difference All In One js var, let, const 区别 All In One 是否存在 hoisting var ...

  6. var let const 的区别

    Var let const 的区别 1.Var 定义的变量存在变量提升,而了let和const不存在变量提升.即在定义的变量代码上使用该变量,var的会输出undefined,而let的会报错. 2. ...

  7. Javascript var 和 let 的区别

    Javascript var 和 let 的区别 var 是函数块的全局变量. let 是代码块的局部变量. let 变量不会提升,如果先使用后定义会 undefind. 参考: https://de ...

  8. 前端面试整理——javascript算法和测试题

    (1)算法: 1.斐波那契数列:1.1.2.3.5.8.13.21.输入n,输出数列中第n位数的值. 方案一: function fn(n){ var num1 = 1, num2= 1, num3 ...

  9. let、var、const用法区别

    1.var var 声明的变量为全局变量,并会进行变量提升:也可以只声明变量而不进行赋值,输出为undefined,以下写法都是合法的. var a var a = 123  2.let let 声明 ...

随机推荐

  1. Grafana中文汉化

    可视化图表 Grafana是一个通用的可视化工具.通过Grafana可以管理用户权限,数据分析,查看,导出,设置告警等. 仪表盘Dashboard 通过数据源定义好可视化的数据来源之后,对于用户而言最 ...

  2. 安卓记账本开发学习day7之完成进度

    支持长按删除记录,与根据备注搜索相关的收入或支出情况

  3. axios 内存泄漏

    有一个项目需要post后台几万条数据,每次只能请求三五条,所以只能在每次请求成功后自调用这个请求函数. 但这样请求了成千上万次后,浏览器会崩溃并报出 out of Memory 错误,经查询,这是内存 ...

  4. Python学习笔记: 通过type annotation来伪指定变量类型

    简介 通过annotation像强类型language那样指定变量类型,包括参数和返回值的类型 因为Python是弱类型语言,这种指定实际上无效的.所以这种写法叫annotation,就是个注释参考的 ...

  5. 项目中导入本地jar包问题

    1. 问题 一个Maven项目,需要依赖一个本地jar包,以如下方式引用: <dependency> <groupId>xxx.sdk</groupId> < ...

  6. CoaXPress 线缆和接插件的设计要求

    本文的原理部分内容不仅适用于CoaXPress 协议,也同样适用于其它高速信号传输情形.在高速.低干扰信号传输时,线缆和接插件的选取是非常讲究的,我们在实际应用中经常会遇到线缆原因.阻抗匹配原因导致的 ...

  7. 碎碎念软件研发02:敏捷之Scrum

    一.什么是 Scrum 1.1 Scrum 定义 Scrum 是敏捷开发方法之一,它使用比较广泛. 敏捷的其它开发方法还有 XP(极限编程).FDD(特性驱动开发).Crystal(水晶方法).TDD ...

  8. ESP8266远程控制电子门

    ESP8266远程控制电子门 最前面介绍: 这是一个使用ESP8266 联网控制继电器,实现手机远程控制电子门,打开关闭,开关一次的物联网联手小项目 附git地址:https://github.com ...

  9. MTK 平台sensor arch 介绍-scp

    架构介绍 路径:vendor/mediatek/proprietary/tinysys/scp 1.[build]编译相关 2.[driver]scp 的driver,I2C,power,eint 3 ...

  10. 如何使用Superset可无缝对接MRS进行自助分析

    摘要:本文主要介绍如何在MRS之上使用Superset进行数据分析. 本文分享自华为云社区<使用商业智能软件Superset分析MRS数据之最佳实践>,作者: 啊喔YeYe . 1. 概要 ...