• 一个js变量以及其作用域的源码示例


    今天遇到了一个问题,抽象出来的代码如下:

    var zoom=13;
    function setZoom(){
    zoom=14;
    }
    function displayZoom(){
    
    this.setZoom();
    alert(zoom);
    var zoom=1500;
    this.changeZoom();
    alert(zoom);
    }
    
    function changeZoom(){
    this.zoom=++zoom;
    }


    执行结果


    ………………………………………………

    …………………………



    ………………



    ………………


    很诧异  undefined 1500


    找找原因,是因为displayZoom()内部重新定义了zoom变量,去掉这个var

    var zoom=13;
    function setZoom(){
    zoom=14;
    }
    function displayZoom(){
    
    this.setZoom();
    alert(zoom);
    zoom=1500;
    this.changeZoom();
    alert(zoom);
    }
    
    function changeZoom(){
    this.zoom=++zoom;
    }

    执行结果是


    ………………………………


    ……………………





    ……………………



    14 1501

    不诧异了


    找了找解释:任何程序语言中变量的作用域都是一个很关键的细节。JS中变量的作用域相对与JAVA、C这类语言显得更自由,一个很大的特征就是JS变量没有块级作用域,函数中的变量在整个函数都中有效

    简单的说


    function displayZoom(){
    
    this.setZoom();
    alert(zoom);
    var zoom=1500;
    this.changeZoom();
    alert(zoom);
    }

    这段代码,执行时,等同于

    function displayZoom(){
    var zoom;
    this.setZoom();
    alert(zoom);
    zoom=1500;
    this.changeZoom();
    alert(zoom);
    }


    所以执行结果是:undefined 1500


    p.s,为了避免上面的这类问题,因此在函数开始位置集中做函数声明是一个极力推荐的做法。 


    dml@2013.8.22

  • 相关阅读:
    转:史上最最佳软件开发实践指导
    django--rtbac权限管理
    爬虫之selenium模块
    爬虫之request模块
    爬虫基础概念
    django--cookie与session
    python--深浅copy
    基于JaCoCo的Android测试覆盖率统计(二)
    jacoco统计Android手工测试覆盖率并自动上报服务器
    macOS10.12部署sonarqube5.6.3
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3275792.html
Copyright © 2020-2023  润新知