JavaScript 学习-变量的作用域和块级作用域

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>

<body>

<script type="text/javascript">
/*
**JAVASCRIPT变量作用域
function add(a, b){
        var sum = a+b;
        return sum;
    };
    
    var rs = add(2,3);
    console.log(rs);
    console.log(sum);    //因为这个sum在函数中是的作用域是add函数域,在函数外是没有办法使用的,所以这个
                    //sum在外部使用的时候是没有定义过的;故会输出这个sum是没有定义的;


    function add(a,b){
            sum  = a+b;        //在这个函数中sum被隐式的声明成了全局变量故是windows对象的变量,在外部是可                                                     //以使用的;
            return sum;
        }
        
        var rs = add(2,3);
        console.log(rs);
        console.log(sum);
        */
        
//没有块级作用域

var a= 8;
var foo = function(){
        console.log(a); // 
        var a = 5;
        console.log(a);
    };        
    
    foo();
    /*
        输出的结果:
        undefined
        5
        结论:由foo函数的内的console.log(a)可以知道,在javascript中是没有块级作用域的,这和c/C++或是
        别的一些语言有所不同的。如果在c/c++中使用如下的代码是没有任何的问题的,
        代码如下:
        #include "stdio.h"
        int i = 109;    //这是i是全局变量
        
        void foo(){
            printf("这个i变量是全局的变量%d\n",i);
            int i = 4;    //这个i是局部变量
            printf("函数中的定义的的i变量%d\n",i);
        }
        void main(){
            foo();
        }
        /*输出结果
        109
        函数中的定义的的i变量4
        Press any key to continue
        因为局部变量在整个函数foo()内都有定义的,整个函数中隐藏了全局变量。虽然局部变量在整个函数体中有定义的,但在var语句之后,所以不会被初始化。所以最好在函数的顶部声明函数中所有用到的变量
    */
    
        
    
</script>
</body>
</html>