var、let、constjavascript
1、varjava
一、声明函数
一直以来咱们都是经过var
关键字定义JavaScript变量。spa
var a = 10;
咱们能够在其余函数内部访问相同的变量code
function f() { var a = 10; return function g() { var b = a + 1; return b; } } var g = f(); g(); // returns 11;
g
能够获取到f
函数里定义的a
变量。 每当g
被调用时,它均可以访问到f
里的a
变量。 即便当g
在f
已经执行完后才被调用,它仍然能够访问及修改a。
blog
function f() { var a = 1; a = 2; var b = g(); a = 3; return b; function g() { return a; } } f(); // returns 2
二、做用域规则ip
对于熟悉其它语言的人来讲,var
声明有些奇怪的做用域规则。作用域
function f(shouldInitialize: boolean) { if (shouldInitialize) { var x = 10; } return x; } f(true); // returns '10' f(false); // returns 'undefined'
变量x
是定义在if
语句里面,可是咱们却能够在语句的外面访问它。 这是由于var
声明能够在包含它的函数,模块,命名空间或全局做用域内部任何位置被访问(咱们后面会详细介绍),包含它的代码块对此没有什么影响。 有些人称此为var
做用域或函数做用域。 函数参数也使用函数做用域。开发
这些做用域规则可能会引起一些错误。 其中之一就是,屡次声明同一个变量并不会报错:it
function sumMatrix(matrix: number[][]) { var sum = 0; for (var i = 0; i < matrix.length; i++) { var currentRow = matrix[i]; for (var i = 0; i < currentRow.length; i++) { sum += currentRow[i]; } } return sum; }
这里很容易看出一些问题,里层的for
循环会覆盖变量i
,由于全部i
都引用相同的函数做用域内的变量。 有经验的开发者们很清楚,这些问题可能在代码审查时漏掉,引起无穷的麻烦。
2、let
let
let hello = "Hello!";
一、块做用域
let声明一个变量,它使用的是 词法做用域 或 块做用域。不一样于使用 var 声明的变量那样能够在包含它们的函数外访问,块做用域变量在包含它们的函数外访问,块做用域变量在包含它们的块或者for循环以外是不能访问的。
a++; // illegal to use 'a' before it's declared; let a;
二、重定义及屏蔽
使用var
声明时,它不在意你声明多少次;你只会获得1个。
function f(x) { var x; var x; if (true) { var x; } }
let
声明就不会这么宽松
let x = 10; let x = 20; // 错误,不能在1个做用域里屡次声明`x`
function f(x) { let x = 100; // error: interferes with parameter declaration } function g() { let x = 100; var x = 100; // error: can't have both declarations of 'x' }
3、const
一、声明
它们与let
声明类似,可是就像它的名字所表达的,它们被赋值后不能再改变。 换句话说,它们拥有与let
相同的做用域规则,可是不能对它们从新赋值。