数据流向 父->子
子函数可以引用外部变量
变量查找 子->父
当搜索一个变量时先从当前区域进行查找,再从上一级区域查找,找到则终止。
同名变量作用域
同名变量作用域互相独立不受影响,独立存在与所在区域有效
'use strict';
function foo() {
var x = 1;
x = x + 1;
}
function bar() {
var x = 'A';
x = x + 'B';
}
变量提升
在执行函数时,会先搜索所有存在的变量名(但不会对变量赋值),再顺序执行语句。
console.log(a); // undefined 表示存在a但无值
var a=10;
// 等同于
var a;
console.log(a);
a = 10;
// 正确写法,变量提前
var a=10;
console.log(a);
命名空间
全局变量污染
function alert() {
return 1;
}
alert("这就是全局变量污染") // 1
减少全局变量污染的最好方法是命名一个对象,将自定义变量全作为他的属性。很多知名js框架都是采用该方法
// 唯一的全局变量MYAPP:
var MYAPP = {};
// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其他函数:
MYAPP.foo = function () {
return 'foo';
};
块级作用域
我们知道js变量只能在当前作用域内使用,该作用域所指的是当前函数作用区域
function aa(){
for(var i=1; i<100; i++ ){
...
}
i+=1; // i可以使用,为101
}
在es6中采用let
来明确指代块级作用域
function aa(){
for(let i=1; i<100; i++ ){
...
}
i+=1; // SyntaxError:
}
Const
const
和let
一样都是块级作用域,const指代于常量,let指代于变量