您的位置:首页 > Web前端 > javascript > 正文

js中作用域

更多 时间:2014-2-16 类别:Web前端 浏览量:6722

js中作用域

js中作用域
  •  
  • 一. 什么是作用域
  •  
  • 它是指对某一变量和方法具有访问权限的代码空间, 在JS中, 作用域是在函数中维护的.
  •  
  • 表示变量或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境。Javascript的作用域只有两种:全局作用域和本地作用域,本地作用域是按照函数来区分的。
     
  •  
  • 二、作用域的注意事项

     

    1.js的作用域是有函数划分的,而不是块儿

    var too="test";

    if(true){//这是在块中的定义,此时还是全局变量
    var too="new test";
    }
    alert(too=="new test");//return true;
    function test()
    {
    var too="old test";//这是在函数中的定义,此时是局部变量

    }

    test();

    alert(too=="new test");//return true;too并没有改变

     

    2.所有属于全局作用域的变量都是window对象的属性

    上面例子中 第一行的 too就是等于 window.too

    看下面的例子

    function test()
    {
    too="test";
    }
    test();

    alert(window.too="test");

    是不是很奇怪,上面例子中函数中的too是局部变量,在这里就是全局变量了

    注意下两个例子的区别,一个通过显示声明 var too

    一个隐示声明too="test";

    也就是说没有显示定义的变量,它就是全局变量,虽然它可能只能在这个函数内使用。

     

    三、作用域实例

    1、

  •  
  • JScript 代码   复制
  • 
    
    if(true){ 
       var aa= "bb"; 
    } 
    console.log(aa); //bb 
    
    for(var i = 0; i < 100; i++){ 
    //do 
    } 
    console.log(i); //100 
    
    		
  •  

    2、

  •  
  • JScript 代码   复制
  • 
    
    var bb = '11111'; 
    function aa() { 
       alert(bb);//undefine 
       var bb = 'test'; 
       alert(bb);//test 
      var cc = "test1"; 
       alert(age);//语法错误 
    } 
    aa(); 
    
    		
  •  

    3、

  •  
  • JScript 代码   复制
  • 
    
    var test = '1111111'; 
    function aa() { 
       alert(test); 
    } 
    
    function bb() { 
       var test = '22222222'; 
       aa(); 
    } 
    
    bb();//alert(1111111); 
    
    		
  •  

    4、

  •  
  • JScript 代码   复制
  • 
    
    alert(typeof aa); //function 
    alert(typeof bb); //undefined 
    
    function aa() { //函数定义式 
       alert('I am 111111111'); 
    }; 
    var bb = function() { //函数表达式 
    } 
    
    alert(typeof bb);//function 
    			
  •  

    5、

  •  
  • JScript 代码   复制
  • 
    
    function aa(){ 
       var bb = "test"; 
       cc = "测试"; 
       alert(bb); 
    } 
    
    aa(); 
    alert(cc);//测试 
    alert(bb);//语法报错 
    
    		
  •  

    四、this指针作用域


    在这里列出this在ECMAScript中的不同含义

    (1) 在全局执行环境中使用this,表示Global对象,在浏览器中就是window对象。

    (2) 当在函数执行环境中使用this时,情况就有些复杂了。如果函数没有明显的作为非window对象的属性,而只是定义了函数,不管这个函数是不是定义在另 一个函数中,这个函数中的this仍然表示window对象。如果函数显示地作为一个非window对象的属性,那么函数中的this就代表这个对象。 (当然可以使用apply或者call函数来取代默认this的引用,详见[P88])

    (3) 当通过new运算符来调用函数时,函数被当做一个构造函数,this指向构造函数创建出来的对象。

     

    五、作用域链

    可以被看作一种路径, 沿着这条路径可以确定变量的值.

    六、作用域链的特点

     

  • (1) var关键字决定了哪个函数是变量的作用域链的终点;
  • (2) 当引用一个变量时, JS会沿着由对象执行路径构成的作用域链进行解析, 查找变量最近定义的值, 一旦找到, 即使用该值.
  •  
  • 七、作用域链的图例
  •  
  •  
  •  
  •  
  • 八、作用域链实例
  •  
  • (1) function example() {
  • var age = 23;
  • }
  • var age = 25;
  • example();
  • alert(age); // 将输出25
  •  
  • 说明: 当执行example时, 首先通过var关键字定义了一个私有变量age, 此时, example成为私有变量age作用域作用域链的终点. 在进行赋值时, 会先从作用域链的终点开始查找变量age, 由于在终点就可以找到, 所以不会继续向上查找, 故而赋值为23后, 也不会影响上一级作用域中的同名变量.
  •  
  • (2) function example() {
  • age = 23;
  • }
  • var age = 25;
  • example();
  • alert(age); // 将输出23
  •  
  • 说明: 当执行example时, 程序准备给变量age赋值, 但程序发现example作用域内, 不存在名为age的
  • 变量, 此时, 程序会沿着作用域链继续向上查找(即在example函数所在作用域内查找), 哟, 程序发现
  • 了一个名为age的变量, 于是它立即拿来用, 这样age被赋值23. 而当alert函数被执行时, 它也会从它
  • 所在的作用域开始查找变量age, 由于当它找到变量age时, 其值已被更新为23, 故而输出结果为23.
  •  

    标签:作用域 js