发表于: 2016-05-30 10:22:31

1 2632


今天完成的事情:刷网上的教程,。。

明天计划的事情:完成task2

遇到的问题:周末懒了

收获:笔记

代码块
for(var i = 0; i < items.length; i++){
    //请脑补“{”和“}”之间有代码
}
if(some_express){
    //请脑补“{”和“}”之间有代码
}
function(param1){
    //请脑补“{”和“}”之间有代码
}
所有{}包起来的代码,都可以称之为 “代码块” , 英文名叫Block。
每个代码块都有一个自己的作用域,作用域决定了变量能否被访问(不论读取变量还是修改变量)。
作用域:
[1] 在最上层没有任何{}包裹的作用域为顶层作用域,声明的变量是哪里都可以访问的
[2]任何一个代码块,{}之间的代码区域称之为它的作用域,每一对大括号括起来的代码块里声明的变量,只能在这个代码块的作用域里访问,不过在js里是不具备这个能力的。 但是为了建立起正确的思维观,我们还是要讲讲块级作用域。虽然语言不支持,但我们人不要跨越块级作用域,这是一个基本素质,会极大的减少Bug发生率。
[3] 代码块是有层级的,在一个代码块里写的新的代码块,后者是前者的子作用域
if(true){
    //相对于下面的代码块的父作用域
    var x = 5;
    if(x > 0){
        //子作用域
    }
}
[4] 子作用域可以访问父作用域的变量,但是父作用域无法访问子作用域的变量
if(true){
    var x = 5;
    if(x > 0){
        var y = "a";
        console.log(x); //可以访问
        x = 6; //也可以访问
    }
    console.log(y); //不应该在这里再访问了。
[5] 作用域的父级的父级作用域的变量,该作用域里也可以访问,甚至无穷多级父的作用域里的变量都可以被访问,这种无穷多级的父,被称之为祖先
if(true){
    var x = 5;
    if(x > 0){
        console.log(x); //可以访问
        for(var i = 0; i < x; i++){
            console.log(x); //也可以访问
        }
    }
}
[6] 顶层作用域是所有作用域的祖先
但是有一件事上一页没有讲到,那就是作用域的覆盖问题,当子作用域有变量与父作用域重名的时候,在子作用域里只能访问到子作用域的变量。称之为 覆盖
var x = 5;
function a(x){
    console.log(x); //这时访问的x就不是父作用域的x了,而是参数x
}
a(6); //打印的是6
console.log(x); //打印的是5
所以,子作用域的覆盖不会消除父作用域的变量,这里是初学者常犯的错误。 



返回列表 返回列表
评论

    分享到