全局作用域、块级作用域
全局作用域
浏览器环境有一顶层对象window,window的属性和var的全局变量等价。
如果用var设置了window对象的内置属性作为变量,内置属性值将会被覆盖。
如果是window对象的内置属性,输出默认值;非内置则输出underfined。
console.log("window.name--"+window.name);
console.log("var.name --"+name);

window.name
name是window的内置属性,返回默认值(默认为空)。
name
前面不加window,作为全局变量,它的值和window.name的值是相同的。
对二者进行判断:
得到的结果为![]()
可以得到结论:window的属性和var的全局变量是等价的
非内置属性n:
console.log("window.n:---"+window.n);
console.log("n---"+n);

如果用var声明一下n:

![]()
变量n就成为window的属性,再次验证window的属性和var的全局变量是等价的。
对比现在模块化编程的理念,显得格格不入。
块级作用域
ES6以前只有全局作用域和函数作用域,并没有块级作用域。
循环体(for...)和条件体(if...)就是块级作用域,花括号:{} ,{{{...}}}块级作用域支持多层嵌套,一层一个区域,每一层都是封闭的(只作用于此)。
如果在块级区域不使用let声明变量,就会造成变量污染。
在ES6之前,采用自我立即执行匿名函数的方式防止变量污染。
函数作用域+自我实行,外部就无法访问。
(function(){
var val=10;
}())
console.log(val);
![]()
let+函数表达式
{
function f(){
console.log("fff");
}
}
f();
{} 块级内的函数 f() 并不处于封闭状态,在外面依然是可以访问的,
若不想在块级以外区域访问,可使用函数表达式构建函数:
{
let f=function (){
console.log("fff");
}
}
f(); //报错

浙公网安备 33010602011771号