es6中的let声明变量与es5中的var声明变量的区别,局部变量与全局变量

自己通过看typescript官方文档里的let声明,与阮一峰老师翻译的的es6学习文档,总结以下三点

1、var声明可以多次重复声明同一个变量,let不行

2、let变量只在块级作用域里面有效果,var 变量不存在块级作用域(块级作用域指用{}包装的代码块,个人理解)

3、let变量不会声明提前,var变量会

以下是具体例子

for(var i=0;i<10;i++){
setTimeout(function(){console.log(i)},1000);
}

由于var声明的变量会声明提升var i 其实就是一个全局变量,console.log(i)里面的i也是全局变量,i在异步函数执行前已经变为了10

所以结果就连续输出了十个10

for(let i=0;i<10;i++){
setTimeout(function(){console.log(i)},i*1000);
}

由于let声明了一个局部变量,console.log(i)里面的i是局部变量,每次循环时输出的都是一个局部变量,所以

结果就连续输出从0到9

let i;
for(i=0;i<10;i++){
setTimeout(function(){console.log(i)},i*1000);
}

输出的是全局变量,所以输出十个10

for(var i=0;i<10;i++){
setTimeout((function(i){console.log(i)})(i),i*1000);
}

(function(i){console.log(i)})(i)将全局变量传入方法里,变成了一个局部变量,然后console.log(i)就是一个局部变量

所以结果是0到9;

方法里面可以把方法当做参数传入,这时的参数如果是在()里面定义的就是局部变量,在闭包里面有用;

var a = function(){
console.log(11);
}
var b = function(a){
a();
}
b(a);

参数a是一个函数,结果是11。

var b = function(a){
a();
}
b( function(){
console.log(11);
});

传递了一个匿名函数,结果也是11。

var b = function(a){
a();
}
b( function a(){
console.log(11);
});

a();

传递并声明了一个函数a; a是一个全局函数,结果也是11,此时的函数声明相当于在外面声明的。

var b = function(a){
a();
}
b( var a=function (){
console.log(11);
});

报错在function的()里面的值是访问的外部的值,在这里面定义的是局部变量,不能够访问,会报错,所以这里不能声明变量。

var b = function(a){
a();
}
b( a=function (){
console.log(11);
});
11var b = function (a) {
  a();
}
b(function () {
  return function () {
    console.log(11);
  }
}());

也可以传递一个自执行函数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏飞雪无情的博客

Go语言实战笔记(四)| Go 数组

数组,是用来存储集合数据的,这种场景非常多,我们编码的过程中,都少不了要读取或者存储数据。当然除了数组之外,我们还有切片、Map映射等数据结构可以帮我们存储数据...

973
来自专栏码洞

《快学 Go 语言》第 7 课 —— 冰糖葫芦串

字符串通常有两种设计,一种是「字符」串,一种是「字节」串。「字符」串中的每个字都是定长的,而「字节」串中每个字是不定长的。Go 语言里的字符串是「字节」串,英文...

935
来自专栏Golang语言社区

Golang语言之defer-再议

defer语句被用于预定对一个函数的调用。我们把这类被defer语句调用的函数称为延迟函数。注意,defer语句只能出现在函数或方法的内部。 一条defer语句...

34614
来自专栏desperate633

关于Java构造函数(Constructor)的常见问题总结1 为什么调用子类的构造方法的时候,默认会调用父类的构造方法2 常见错误:Implicit super constructor is und

当继承自一个类的时候,构造方法就会首先调用super()方法。如果没有显式的写这个语句,那么编译器就会自动插入这个语句。这就是为什么我们上面的那个例子程序会先调...

1013
来自专栏有趣的django

19.JavaScript

简介 JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型 1.注释 单行 // 多行 /* */ 2.引用...

3185
来自专栏Micro_awake web

JavaScript正则表达式(Regular Expression):RegExp对象

第一部分:新建正则表达式 JavaScript中正则表达式是参照Perl 5(一门历史很悠久的语言,现在tiobe编程语言排行依然在10名左右)建立的。 新建正...

2015
来自专栏技术碎碎念

python3 入门 (一) 基础语法

1.编码问题 默认情况下,Python 3源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 也可以为源码文件指定不同的编码,在文件头部加上...

2887
来自专栏黑泽君的专栏

DOM(文档对象模型)基础加强

531
来自专栏小筱月

javascript闭包问题

并没有,在这里,var c = a(); 这段代码意思是将 a 方法的返回值赋值给变量 c ,那么 a() 的返回值就是 inc ,也就 function in...

782
来自专栏封碎

Python中的简单类型 博客分类: Python PythonCC++C#编程

整数 & 浮点数 整数有两种,分别是 int 和 long。其中 int 最大值是 2147483647 (sys.maxint),而 long 长度仅...

993

扫码关注云+社区