es6 初级之let
1.在es6 中,定义变量使用 let.
1.1 var定义变量:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script>
var j = 39;
var j = "aaa";
console.log(j);
</script>
</head>
<body>
</body>
</html>
运行结果:

1.2 let定义变量:换成使用ES6 的 let 相同格式定义变量:
let j = 39;
let j = "aaa";
console.log(j);
输出:输出报错

原因:let 是块级作用域,不可以重复定义
1.3 所谓块级作用域,可以理解为{}括起来的范围,或者函数体内部的范围,例如:
let a = 10;
if (a) {
let a = 100;
console.log(a); //100
}
console.log(a); //10

1.4 var 和let的区别:
1.4.1 输出var 循环后的i 值
for (var i = 1; i <= 10; i++) {
}
console.log(i); //
结果:循环后,输出结果为11

1.4.2 输出 let 循环后的 i 值
for (let i = 1; i <= 10; i++) {
}
console.log(i); //外面访问不到
结果:输出后,结果报错,显示没有定义。

1.4.3 在for循环内,i 值可以输出
for (let i = 1; i <= 10; i++) {
//可以访问的到
console.log(i);
}
console.log(i); //外面访问不到
运行结果:

1.5 var 和 let 在函数中的差异
1.5.1 var
function show(flag) {
console.log(a); //undefined
if (flag) {
var a = 'aluoha';
return a;
} else {
console.log(a); //undefined
return null;
}
}
show(false);
show(true);
运行结果:

1.5.2 let
function show(flag) {
console.log(a); //报错了
if (flag) {
let a = 'ghostwu'; //let定义的变量不会提升
return a;
} else {
console.log(a);
return null;
}
}
show(false);
show(true);
运行结果:在第11行直接报错了,因为在第2行的console.log(a)中,a 没有定义

报错原因:i 用let 进行定义,let是块及作用与,只是在{}内起作用,{}外就不起作用了;但是,如果使用var 定义i,var 是全局作用域,会进行变量提升,将var a 提到console.log(a)之前,所以就不会报错
2. let 应用:
获取点击框的索引:
下面这种方式无法获取:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script>
window.onload = function() {
var aBtn = document.querySelectorAll("input");
for (var i = 0; i < aBtn.length; i++) {
aBtn[i].onclick = function() {
console.log(i);
}
}
}
</script>
</head>
<body>
<input type="button" value="按钮1">
<input type="button" value="按钮2">
<input type="button" value="按钮3">
<input type="button" value="按钮4">
</body>
</html>
结果:无论点击那个按钮,得到的结果都是4

原因:i 循环后,结果是4;而点击事件是一个异步事件,异步事件的执行总是在同步事件的执行之后,执行完循环,才会去执行点击事件
2.1 通常的做法,在input 元素上加上一个自定义的索引 index ,点击的时候,获取index 的值,而不是获取 i 的值,这样就可以达到获取索引的目的了
js代码修正:
<script>
window.onload = function() {
var aBtn = document.querySelectorAll("input");
for (var i = 0; i < aBtn.length; i++) {
aBtn[i].index = i;
aBtn[i].onclick = function() {
console.log(this.index);
}
}
}
</script>
结果:

2.2 采用闭包的方式获取索引:
window.onload = function() {
var aBtn = document.querySelectorAll("input");
for (var i = 0; i < aBtn.length; i++) {
aBtn[i].onclick = (function(j) {
return function() {
console.log(j);
}
}(i));
}
}
结果:

2.3 采用es6 let 方式定义:
window.onload = function() {
var aBtn = document.querySelectorAll("input");
/*
第一次 i = 0, i++之后 ---> 释放
第一次 i = 1, i++之后 ---> 释放
*/
for (let i = 0; i < aBtn.length; i++) {
aBtn[i].onclick = function() {
console.log(i);
}
}
}
运行结果:

es6 初级之let的更多相关文章
- es6 初级之展开运算符
1.1 先看一个求最大值的例子 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- es6初级之箭头函数实现隔行变色
无论是使用哪种方式实现隔行变色的效果,它的思路都是一样的: 1.定义很多个div 2.给div 加背景 3.鼠标移动到div上时,当前div 背景变色 4.鼠标移出div时,当前div背景恢复 以上4 ...
- es6初级之解构----之二 及 键值反转实现
1.解构: 不定参数,扩展表达式 let arr = [100, 201, 303, 911]; let [one, ...others] = arr; console.log(others.leng ...
- es6初级之解构----之一
1. 访问对象属性 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- es6 初级之---const 和 默认参数
1. const 的定义: 1.1 常量定义的时候要赋值,不赋值是会报错的: <!DOCTYPE html> <html lang="en"> <he ...
- es6 初级之箭头函数
1.先看一个例子: <script> function show() { console.log('aluoha'); } show(); </script> 2. 改写成简单 ...
- Es6学习指南-1-函数变量
本篇章我们简述的是 es6初级知识点,认识es6,以及es6变量和es5的变量和函数. ECMAScript 6简介 ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代 ...
- 互联网公司前端初级Javascript面试题
互联网公司前端初级Javascript面试题 1.JavaScript是一门什么样的语言,它有哪些特点?(简述javascript语言的特点)JavaScript是一种基于对象(Object)和事件驱 ...
- Yeoman+Bower+gulp web前端自动化工作流程(初级教程)
Yeoman包括了三个部分yo(脚手架工具).grunt/gulp(构建工具).bower(包管理器).听说gulp更容易上手,所以我就没用grunt而选的gulp 什么是开发流程? 在我看来一个完整 ...
随机推荐
- [UE4]GameInstance初始化
GameInstance的生命周期跟游戏进程一样. 每一次进入游戏都会初始化一个GameInstance,直到退出游戏才会被销毁. 不会随着场景的变化而被销毁.
- OA-DB-LINUX安装说明
HOST配置: HOST1:OADB-NODE1.LSTECH.COM HOST2:OADB-NODE2.LSTECH.COM 每台主机配置两个不同VLAN的IP地址 OSUSER:oracle 1. ...
- 第一章 :zabbix监控
1.1 为什么要监控 在需要的时刻,提前提醒我们服务器出问题了 当出问题之后,可以找到问题的根源 网站/服务器 的可用性 1.1.1 网站可用性 在软件系统的高可靠性(也称为可用性,英文描述为HA ...
- .net core 认证
http://www.cnblogs.com/RainingNight/p/cookie-authentication-in-asp-net-core.html
- Linux网卡配置文件参数注释
Linux网卡配置文件参数注释 作者:Eric 微信:loveoracle11g [root@linux-node2 ~]# cat /etc/sysconfig/network-scripts/if ...
- Docker 系列01: Centos7.3 上安装docker
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器 ...
- Android模块化开发、组件化开发;
模块化开发:优点嘛,项目过大时便于管理: 1.在根目录的gradle.properties文件下添加 isBuildModule=false: 使用isBuildModule来控制这个是Library ...
- linux web服务基础知识,dns
#web服务基础知识c/s 客户端/服务器b/s 浏览器/服务器 nginx > web server 服务端浏览器 > web client 客户端 #dns解析 ...
- JVM总结-Java 虚拟机是怎么识别目标方法(下)
1. 虚方法调用 在上一篇中我曾经提到,Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用都会被编译成 invokeinterface 指令.这两种指令, ...
- 下雨天,适合学「Spring Boot」
北方的闷热,让不少小伙伴盼着下雨,前几天北京下了场大雨,杭州也紧跟这下了场雨,就在昨天原本还很闷热的天,突然就飘泼大雨了.今天也断断续续的下着小雨,一觉醒来已经是10点了.有句话说:懒惰是人的天性 ...