js作用域

先看下面2个例子

<script>
fn();
 var fn =function (){
    alert("fn called");
}
</script>

上面代码报错

求阶层一把使用

<script>
function fn(n){
    if(n<=1) return 1;
    return n*arguments.callee(n-1);
}
</script>

在EMCAscript第五版的静态模式中,callee被禁用

作用域
1.全局作用域
2.函数作用域
1.1.全局作用域 是函数之外(最外层代码)的作用域. 在函数之外进行声明的名称属于全局作用域,这里的名称就是所谓的
全局变量及全局函数
在函数内进行声明的名称拥有的函数作用域,又称局部作用域,作为函数形参的参数变量也属于局部函数作用域。
在javascript中函数作用域与进行声明的行数没有关系

 

<script>
    var x=1;
    function f(){
    p("x="+x);//x=undefined
    var x=2;
    p("x="+x);//x=2
    }
    f();
    </script>

 

局部变量的作用域是整个函数f内部,由于此时还没有对其赋值,所以最开始读取的是undefined
其与下面代码等价

<script>
    function f(){
        var x;
        p("x="+x);
        x=2;
        p("x="+x);
    }
    </script>

所以建议在函数的开始处对所有的局部变量进行声明

<script>
    var x=1;
    function f(){
        p("x="+x);//x=1
    }
    f();
    </script>

块级作用域
js中不存在块级作用域

<script>
    var x=1;
    {
        var x=2;
        p("x="+x);  //2
    }
    p("x="+x);//2
//for语句中对循环变量进行声明是一种习惯做法
    </script>
let与块级作用域
    js随无块级作用域,let可实现同等效果
    一.let定义(let声明)
    二.let语句
    三.let表达式
    1.let定义
        let var1[=value1] [,var2 [=value2] .........;

 

posted @ 2015-01-20 20:15  H&K  阅读(347)  评论(0编辑  收藏  举报