• Js作用域链及变量作用域


    要理解变量的作用域范围就得先理解作用域链 
    用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性。 
    作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是window对象的属性,所以这些对象的关系可以看作是一条链 
    链头就是变量所处的对象,链尾就是window对象

    看下面的代码:

    function t() { 
    var a; 
    function t2() { 
    var b; 
    } 
    }

    js中函数也是对象,所以变量a所在的对象是t,t又在window对象中,所以a的作用域链如下 
    t--window 
    那么b所以在的对象即t2,t2又包含在t中,t又在window对象,所以b的作用域链如下 
    t2--t--window 
    明白了作用域链下面就开始变量的作用域分析了 
           
    1 javascript 没有var的变量都为全局变量,且为window对象的属性

    复制代码
    function test1() { 
    //执行这个句的时候它会找作用域对象,这个函数就是作用域链中的第一个对象,但这个对象中没有相关的var语句 
    //于里就找作用域链的第二个对象,即全局对象,而全局对象中也没有相关的var语句 
    //由于没有相关的var语句,js隐式在函数地声明了变量即var all; 
    all = 30; 
    alert(all); 
    } 
    
    test1();
    
    alert(all); 
    alert(window.all);
    复制代码

    2 函数内(函数内的函数除外)定义的变量在整个函数内部都有效

    复制代码
    function test2() { 
    var t = 0; 
    //在for的条件里定义变量,这个变更的作用域链对象是这个函数 
    //因此在整个的函数里它是有效的 
    for (var i = 0; i < 5; i++) { 
    t += i; 
    } 
    alert(i); 
    } 
    test2();
    复制代码

    3 函数内部的变量取代全局同名变量

    复制代码
    var t = "bb"; 
    function test() { 
    //执行t的时候,它会先找作用域链对象,由于它定义在函数内部,所以这个函数就是它的作用域链的第一个对象 
    //而在这个对象里又有t的定义,所以t就是局部变量了,它替换了全局变量t
    
    //t只是此时有定义,但并没有赋值,赋值在下一行,所以这里输出了undefined 
    alert(t); 
    var t = "aa"; 
    alert(t); 
    } 
    test();
    复制代码

    4 没块的作用域

    if (true) { 
    //在块中定义了一个变量,它的作用域链的第一个对象就是全局对象window 
    var tmp = 0; 
    } 
    //tmp的作用域链的第一个对象就是全局对象window,而上面又有全局对象中相关的var语句,因此输出0 
    alert(tmp); 

    转自:http://www.cnblogs.com/mu-mu/archive/2012/11/19/2777007.html
  • 相关阅读:
    一个陌生女人的来信 Brief einer Unbekannten
    占星术的历史与流变
    占星术基础知识(星座及其标志)
    _________ 公告栏___________
    意识科学初步:David Chalmers的简单问题与困难问题
    意识科学初步:David Chalmers的简单问题与困难问题
    科研笔记(2019年01月29日01:17:57):Python写用于交付的工程项目的基本流程
    中国知网(cnki)上caj格式转pdf的方法
    灰色关联度分析(Grey Relation Analysis,GRA)原理详解
    货币金融学(米什金)笔记:金融体系、货币相关
  • 原文地址:https://www.cnblogs.com/sweeeper/p/5454174.html
Copyright © 2020-2023  润新知