作用域决定了代码区块中变量和其他资源的可见性,**作用域就是一个独立的独立的地盘,让变量不外泄.暴露出去,作用域最大的用处就是隔离变量,不同作用域下变量名不会冲突
当打开页面的时候,会提供一个供js代码执行的环境,全局作用域,会默认提供一个最大的window对象。
【全局变量】:在全局作用域中声明的变量就是全局变量,其中下面的a 和fn 就是全局变量
【全局变量和window关系】 在全局作用域中声明的变量:var、function(除去es6的),相当于给window上添加了属性,属性名就是变量名,属性值就是变量值
调用window 下的方法时,可以省去window不写:
window.alert("1");
alert("1");
window.Number("1");
Number("1");
var a=3; // a是全局变量
function fn(){ // fn 是全局变量
var num=3;
function f1(){
}
}
console.log(window.a);
console.log(window.fn);
var a = 66;
function fn() {
var x = 1;
var y = 3;
console.log(a);//66
return x + y;
}
console.log(x);// x is not defined
fn();
块语句(大括号{}中间的语句)如Switch和if条件语句或for和while循环语句,不像函数它们不会创建新的作用域,在块语句级作用域中定义的变量将保留在他们已经存在的作用域中
console.log(a);//Uncaught ReferenceError: a is not defined
let a=2;
阻断了和window的关系
let a=2;
console.log(window.a);// undefined
let a=2;
console.log(a);
var a=3; // 不能进行重复的声明:Uncaught SyntaxError: Identifier 'a' has already been declared
console.log(3);
暂时性死区
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量就会报错。在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
原创©本文章为梁鹏翱原创,未经许可,禁止转载
0条评论