本身经过看typescript官方文档里的let声明,与阮一峰老师翻译的的es6学习文档,总结如下三点javascript
一、var声明能够屡次重复声明同一个变量,let不行java
二、let变量只在块级做用域里面有效果,var 变量不存在块级做用域(块级做用域指用{}包装的代码块,我的理解)es6
三、let变量不会声明提早,var变量会typescript
如下是具体例子闭包
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到9spa
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);
}
}());
也能够传递一个自执行函数