ES5和ES6作用域
ES5和ES6作用域
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>ES5和ES6的区别</title>
</head> <body>
<script type="text/javascript">
//ES5 中作用域,
const callbacks = []
//i是通过var定义的 是全局变量
for (var i = 0; i <= 2; i++) {
//闭包的作用域是全局
callbacks[i] = function() {
return i * 2 //callbacks中的return i*2,是对变量的引用,而不是对函数变量值的引用。函数体中是一个变量,而不是一个值
}
}
console.table([
callbacks[0](), //6,for循环执行完毕,i=3,调用callback的时候 i=3
callbacks[1](), //6
callbacks[2](), //6
]);
console.log([
callbacks[0](),
callbacks[1](),
callbacks[2](),
]); //ES6 作用域
const callbacks2 = []
//用let声明的变量有块作用域的概念
for (let j = 0; j <= 2; j++) {
callbacks2[j] = function() {
return j * 2 //闭包取决于当前的块作用域,每循环一次,它就重新生成新的作用域
}
}
console.table([
callbacks2[0](), //0
callbacks2[1](), //2
callbacks2[2](), //4
]); //ES5 es5中要执行立即执行函数((function(){},()),才能对作用域进行隔离。
((function() {
const foo = function() {
return 1;
}
console.log("foo === 1", foo() === 1);
((function() {
const foo = function() {
return 2;
}
console.log("foo === 2", foo() === 2);
})())
console.log("foo === 1", foo() === 1);
})())
//ES6 es6:{}表示一个新的作用域,{}可以对作用域进行隔离。
{
function foo() {
return 1;
}
console.log("foo === 1", foo() === 1); {
function foo() {
return 2;
}
}
console.log("foo === 2", foo() === 2); } //ES3,ES5写法
var evens = [1, 2, 3, 4, 5];
var odds = evens.map(function(v) { //遍历
return v + 1
});
console.log(evens, odds)
//ES6箭头函数
{
let evens = [1, 2, 3, 4, 5];
let odds = evens.map(v => v + 1);
console.log(evens, odds)
}
/*
*箭头函数与普通函数的区别,在于this的绑定 */
//ES3,ES5,this指向是该函数被调用的对象
{
var factory = function() {
this.a = 'a';
this.b = 'b';
this.c = {
a: 'a+',
b: function() {
return this.a
}
}
}
console.log(new factory().c.b()); //a+
}
//ES6 this指向定义时的this
{
var factory = function() {
this.a = 'a';
this.b = 'b';
this.c = {
a: 'a+',
b: () => {
return this.a
}
}
}
console.log(new factory().c.b()); //a
}
/*
**默认参数
*/
{
//ES3,ES5默认参数写法
function f(x, y, z) {
if (y === undefined) {
y = 7;
}
if (z === undefined) {
z = 42;
}
return x + y + z; }
console.log(f(1)); //50
console.log(f(1, 3)); //46
} {
//ES6 默认参数写法
function f(x, y = 7, z = 42) {
return x + y + z;
}
console.log(f(1)); //50
console.log(f(1, 3)); //46
} {
//es6 检查X默认参数是否赋值了
//先声明一个函数
function checkParameter() {
// throw new Error阻止js运行
throw new Error('can\'t be empty')
} function f(x = checkParameter(), y = 7, z = 42) {
return x + y + z;
}
console.log(f(2));
try {
f();
} catch (e) {
console.log(e)
} finally {}
} {
// ES3,ES5 可变参数
function f() {
var a = Array.prototype.slice.call(arguments); //伪数组,获取当前的参数列表
var sum = 0; //初始值
a.forEach(function(item) {
sum += item * 1; //求和运算
})
return sum;
}
console.log(f(1, 2, 3))
} {
//ES6 可变参数写法
//...a代表扩展运算符,可变参数的列表
function f(...a) {
var sum = 0;
a.forEach(item => {
sum += item * 1; //求和运算
})
return sum; }
console.log(f(1, 2, 3))
}
/*
**合并数组
*/
{
//es5 合并数组
var params = ['hi','true',7];
var other = [1,2].concat(params);
console.log(other)
}
{
//es6 利用扩展运算符合并数组写法
var params = ['hi','true',7];
var other = [1,2,...params];
console.log(other)
}
</script>
</body> </html>
效果图:
ES5和ES6作用域的更多相关文章
- React入门 (1)—使用指南(包括ES5和ES6对比)
前言 本篇会简明扼要的介绍一下React的使用方法.代码会用JSX+ES5和JSX+ES6两种方式实现. React简介 React来自Facebook,于2013年开源.至今不断修改完善,现在已经到 ...
- JavaScript、ES5和ES6的介绍和区别
JavaScript由三部分组成: ECMAScript(核心) DOM(文档对象模型) BOM (浏览器对象模型) ES5(ECMAScript第五个版本) strict模式 严格模式,限制一些用法 ...
- ES5和ES6那些你必须知道的事儿(三)
ES5和ES6那些你必须知道的事儿 ES6新增的东西 一.块级作用域:关键字let,常量const let与var的区别: a.不会进行变量声明提升 b.变量不允许被重复定义 c.变量不允许被删除 d ...
- ES5与ES6的小差异
ES5与ES6的小差异 变量的定义 ES6与ES5的区别 ES5: <script> console.log(username); var username; var username = ...
- React Native的语法之ES5和ES6
原文地址:http://www.devio.org/2016/08/11/React-Native%E4%B9%8BReact%E9%80%9F%E5%AD%A6%E6%95%99%E7%A8%8B- ...
- 多角度对比 ES5与ES6的区别
ES5与ES6的对比不同点整理 本文关键词:ES6,javascript, 1.Default Parameters(默认参数) es6之前,定义默认参数的方法是在一个方法内部定义 var link ...
- ES5与ES6常用语法教程之 ②解构语法糖、声明变量异同
js常用语法系列教程如下 es5与es6常用语法教程(1) es5与es6常用语法教程(2) es5与es6常用语法教程(3) es5与es6常用语法教程(4) es5与es6常用语法教程(5) es ...
- ES5和ES6基本介绍与面向对象的基本思想
ES6和ES5基本介绍 let const 关键词定义变量 let 定义变量 特点: let 定义的变量,不会进行预解析 let 定义的变量,与 forEach() 中的变量类似 每次执行都会 ...
- ES5和ES6中对于继承的实现方法
在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是 ...
随机推荐
- IBM X3650 M4 主板故障
故障描述: 今天突然接到报警,一台服务器无法连通,无法登录.无法 ping 通. 打电话到 IDC ,授权工程师查看服务器状态,返回结果如下: 1.服务器关机状态 2.无法开机 ( 电源灯亮 ),按开 ...
- 【324】Python 库说明(安装&卸载)
参考:Python_安装官方whl包和tar.gz包 参考:Unofficial Windows Binaries for Python Extension Packages 参考:PyPI 参考:直 ...
- SOAP 版本可能不匹配: 出现意外的 Envelope 命名空间 http://schemas.xmlsoap.org/wsdl/
原错误描述:SOAP 版本可能不匹配: 出现意外的 Envelope 命名空间 http://schemas.xmlsoap.org/wsdl/.应为 http://schemas.xmlsoap.o ...
- Android提交自己的作品到GitHub上
最近在做一个期待上架的我个人写的App,我打算将它开源出去,托管到GitHub上.看了一下网上的教程,其实五花八门,我照着做了,还是没法提交到GitHub上.自己研究了一下,其实非常的简单.这里决定介 ...
- CentOS7.2部署KVM虚拟机
转自:http://www.linuxidc.com/Linux/2017-01/140007.htm 学习了关于PostGis.OSM数据以及Mapnik相关内容,接下来将利用假期重点学习Postg ...
- Java程序设计17——多线程-Part-C
11 使用管道流 前面介绍的两种方式与其称为线程之间的通信,还不如称为线程之间协调运行的控制策略.如果需要在两条线程之间进行更多的信息交互,则可以考虑使用管道流进行通信. 管道流有3中存在形式:Pip ...
- C#分布式事务解决方案-TransactionScope(转)
出处:C#分布式事务解决方案-TransactionScope 引用一下别人的导读:在实际开发工作中,执行一个事件,然后调用另一接口插入数据,如果处理逻辑出现异常,那么之前插入的数据将成为垃圾数据,我 ...
- cxf的一些使用说明
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agree ...
- CSS—— em的详解
字体大小在浏览器的默认样式表中有规定.一般采用em为单位,也就是相对单位,1em=16像素. 同时,像P h1等等标签都采用浏览器默认的em单位,P为1em,h1为2em等等. 两条重要的规则: 1. ...
- Linux umask权限
文件基本权限 Linux中文件权限由三部分组成: rw-r--r-- 前三位:表示用户所拥有的权限 中三位:表示用户所在组的权限 后三们:表示其他用户的权限 权限 八进制 十进制 - - - 000 ...