// 变量声明
// 三种方式: var Let const
// 1.var声明
var a = 10;
function fn(){
var message = 'Hello,world!';
return message
}
function fn2(){
var a = 10;
return function fn3(){
var b = a + 1;
return b;
}
}
var g = fn2();
g()
// console.log(g()); // return 11
// 上面的例子里,g可以获取到f函数里定义的a变量。 每当 g被调用时,它都可以访问到f里的a变量。 即使当 g在f已经执行完后才被调用,它仍然可以访问及修改a。
function f() {
var a = 1;
a = 2;
var b = g();
a = 3;
return b;
function g() {
return a;
}
}
f(); // returns 2
// a.作用域规则
function fun(shouldInitialize: boolean) {
if (shouldInitialize) {
var x = 10;
}
return x; // TypeScript报错:在赋值前使用了变量“x”
}
// console.log(fun(true)) // 10
// console.log(fun(false)) // undefined
// 变量x的定义在if判断语句中,但我们在外面能够访问到x。这是因为var声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问,包含它的代码块对此没有什么影响。 有些人称此为var作用域或函数作用域。 函数参数也使用函数作用域。
// 使用var作用域可能导致的错误:
// 多次声明一个变量不会报错
function sum(arr: number[][]){
var num = 0;
for(var i = 0; i < arr.length; i++){
var num2 = arr[i];
for(var i = 0; i < num2.length; i++){
num += num2[i]
}
}
return num
}
// console.log(sum([[1,2,3,4,5,6,7,8,9,10]])) // 55
// b.捕获变量怪异之处
for (var i = 0; i < 10; i++){
// setTimeout(function(){console.log(i), 100}); //[10,10,...,10];
}
// 因为for循环每次执行的都是相同作用域同一个变量i 所以每次都是在循环完成后打印10
// 解决方法就是利用立即执行函数
for(var i = 0; i < 10; i++){
(function(i) {
// setTimeout(function() { console.log(i); }, 100 * i); //[0,1,2,...,9]
})(i);
}
// 2.Let声明 (写法与var一致,主要在于语义上的区别)