javascript作用域

javasript由于是弱类型语言,变量会提升,因此我们需要掌握好作用域,以及作用域链

   1.变量提升(可先使用后声明) 

code:

alert(a);//1 ,变量已提升

alert(b);//undfined,变量已提升

       alert(c);//报错,因为c没有用声明,所有没有提升。

       alert(d);//报错,预编译时,只声明了函数,并没有执行,所以d没有声明,也会报错

var a=1;

if(false){ var b=2; }else{c=3;}

function f(){var d=4;}

2.js语言没有块级作用域

for(var i=0;i<3;i++){}alert(i);//3 表示js语言没有块作用

 

3.js没有动态作用域

function f(){alert(x);}

function f1(){var x=5; f();}

function f2(){var x=6;f();}

f1();//报错,x is not defined ---说明js没有动态作用域

f2();//报错,x is not defined

4.js没有函数作用域 和 动态作用域;只有静态作用域(也就是闭包)

var x=100;

function f(){

         //var x=60; //如果不注释 结果输出60

alert(x);

}

function f1(){

    var x=5;

f();

}

       function f2(){

            var x=6;

f();

}

f1();//100

       f2();//6

5.作用域链

function f(){//浏览器解析创建时 scope==window

//f()被调用时,创建自己的词法作用域 le{x=100} ->f.[[scope]]

    var x=1000;

         function g(){//创建时 g.[[scope]]==f.le

//被调用运行时 le->g.[[scope]]

         }

                g();

}

     f();

形成作用域链:le->g.[[scope]] ->f.le ->f.[[scope]]==window

 

6.函数与作用域

6.1js创建函数的几种方法

     function f(){}

var f=function(){}

       var f=function x(argument){}

var f=new Function("","alert(x)")//这种方式创建的函数作用域指向全局

//一般函数的定义,正常的作用域链

function f(){

            var x = 100;

            var g = function (){// js没有函数作用域如果是函数作用域,则不能访问到x=100,但现在可以

            alert(x);

            }

             g();

        }

        f();//调用 函数,输出100

//使用new的创建的函数 指想window

            var x=12;//加上这句输出12,不加的话,程序会报错,说明new出来的是指向全局的

            function f(){

                var x = 100;

                var g =new Function ("","alert(x)");

                g();

            }

        f(); //这里输出12

//举例:说明js没有动态作用域

            function f(){

                     alert(x);

                }

           function f1(){

                    var x = 5;

                f();//没有动态作用域就不会访问f1的 x变量

            }

           function f2(){

            var x = 6;

                f();

                }

        f1();//如果是动态作用应该会输出5

        f2();//如果是动态作用应该会输出6

 

//举例 作用域链

         var a=100; // 第三是找到作用域的这个层

        function f(){

            var a=2; // 第二是找个作用域的这个层

            function g(){

                var a = 5; //最先找到这个来输出

               console.log(a)

         }

         g();

     }

    f();

//扩展

    (function(){

     var a=5;

        var b=6;

         function f(){

            alert(a);

        }

         window.f=f;

        })();

     f();//强类型语言是获取不到a=5 b=6的,这是js的特殊之处

 

 

 
 

 

 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值