全局作用域、块级作用域

全局作用域

浏览器环境有一顶层对象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(); //报错    

 

 

  

posted @ 2021-11-24 18:37  十七日尾  阅读(73)  评论(1)    收藏  举报