安装node.js
node.js模块管理中心 https://www.npmjs.com
可用得到两个命令
node --version npm --version
安装TypeScript依赖环境
npm install -g typescript
执行命令后会打印
C:\Users\Administrator\AppData\Roaming\npm\tsserver -> C:\Users\Administrator\AppData\Roaming\npm\node_modules\typescript\bin\tsserver C:\Users\Administrator\AppData\Roaming\npm\tsc -> C:\Users\Administrator\AppData\Roaming\npm\node_modules\typescript\bin\tsc + typescript@2.8.3 added 1 package from 1 contributor in 12.914s
检查TypeScript编译环境版本
tsc -v
执行命令后会打印
Version 2.8.3
变量定义 var
同一个作用域可以多次定义
var a = 1; var a = 2; var a = 3;
同一个作用域可以多次定义, 造成外面一层for没正常运行
for 不是作用域,他算是f里的函数域
用let定义, for里也是一个作用域
在其他语言, 不允许再定义相同名称的变量
function f()
{
for(var i = 0; i < 2; i ++)
{
print(`~~ ${i}`);
for(var i = 0; i < 3; i ++)
{
print(`row ${i}`);
}
log(`##i=${i}`)
}
log(`@@i=${i}`)
}
~~i=0 row i=0 row i=1 row i=2 ##i=3 @@i=4
同一个作用域可以在任何地方定义
用let定义,是不能在定义之前调用的, 否则编辑器会提示错误
var a = 1;
function f()
{
a = 100; // 可以在定义之前就赋值,运行时他已经定义了, 就算外层有定义a=1,这里的a也是f函数作用域的
var a;
print(a); // 100
}
f();
print(a); // 1
if 不是作用域,他算是f里的函数域
用let定义, if里也是一个作用域。 a = 100; 将会修改闭包方法里定义的a=1
在其他语言,if里也是一个作用域, 并且在定义变量前 a将用的是闭包方法里声明的变量
var a = 1;
function f(isIn:boolean = false)
{
a = 100;
if(isIn)
{
var a;
}
log(a); // 100
}
f();
log(a); // 1
var a = 1;
function f(isIn:boolean = false)
{
a = 100;
if(isIn)
{
let a; // 这里的a只在if语句块里有效
}
log(a); // 100
}
f();
log(a); // 100
setTimeout调的函数里方法的变量,始终都是读取的闭包方法上层定义的变量
function f()
{
for(var i = 0; i < 10; i ++)
{
setTimeout(function() {
log(i); //打印的始终都是10
}, 100 * i);
}
}
解决方法是, 再封一层闭包
用let定义,编译后的 js 也是这样实现的
function f()
{
for(var i = 0; i < 10; i ++)
{
(function(val)
{
setTimeout(function() { log(val); }, 100 * val);
})(i);
}
}
变量定义 let
let 定义的变量,不可以在区域块外调用,否则会提示错误。
let 定义的变量,if 、for都将是作用域

不可以在let定义前调用, 否则会提示错误

下面这种情况 if外面的 a将是 var a=1那定义的

编译后的js

在同一作用域不可以重复定义let变量

编译后的js
所有可以这么说, let定义的变量,再闭包方法情况下,上下文都有相同的变量名。在编译成js后,将会给他们分别命名


编译后的js

在一个嵌套作用域里引入一个新名字的行为称做屏蔽。 它是一把双刃剑,它可能会不小心地引入新问题,同时也可能会解决一些错误。 例如,假设我们现在用 let重写之前的sumMatrix函数。

编译后的js

输出:
row i=1 row i=2 ##i=1 ~~i=2 row i=0 row i=1 row i=2 ##i=2 ~~i=3 row i=0 row i=1 row i=2 ##i=3 sum = 324
块级作用域变量的获取

