• var与Javascript变量‘隐式'声明


    在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它。
    var x = "XX";
    y ="xxx";
    诸如此类。这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于“隐式”声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现。
    除此之外,今天通过同事介绍,了解到这种“隐式声明”中的别外一个问题。
    当你在当前上下文内进行这种“隐式”声明时,JavaScript引擎会先在当前上下文中寻找是否之前有声明此变量,如果没有,再到上一级的上下文中去寻找,如果一直未找到,会最后在window上声明这个变量!
    比如:

     

    window. y = "hello";

    function func(){
    = "OH, NO!!!";
    }

    func();
    alert(window.y); 
    //#=> display "OH, NO!!!"

     

    当上下文中的任意一层有这种“隐式”定义的变量时,那么该层的该变量会被修改,而不会在window上生成一个新的变量。(这种bug也挺讨厌的,尤其是封装的比较复杂的代码)
    比如:

    var x = "window.x";
    function a() {
    var x = "a's x";
    var b = function() {
    var c = function() {
    //no var!
    = "c's x:";
    };
    alert(
    "before c run,the b.x:" + x);
    c();
    alert(
    "after c run, the b.x:" + x);
    };
    alert(
    "a.x is:" + x);
    b();
    alert(
    "after b function runed, the a.x is:" + x);
    };
    alert(
    "before a run, window.x:" + x);
    a();
    alert(
    "after a run, window.x:" + x);

    这里面有以下几层:window, func a, func b, func c一直作层级嵌套。window->a->b->c
    window和a中,都有定义变量x,b中未定义该变量,在c中‘隐式’声明了一个x,该x最终修改了a变量的值。
    牢记,在JavaScript中,声明变量,一定前面要加var

  • 相关阅读:
    python接口自动化测试二十四:上传多个附件,参数化
    python接口自动化测试二十三:文件上传
    python接口自动化测试二十二:文件下载
    python接口自动化测试二十一:类和方法
    Delphi开发ocx插件的调试
    Confluence 6 推荐的更新通知设置和禁用
    Confluence 6 配置推荐更新邮件通知默认的初始化设置
    为 Confluence 6 分发包设置一个邮件会话
    Confluence 6 测试电子邮件设置
    为 Confluence 6 配置发送邮件消息
  • 原文地址:https://www.cnblogs.com/wupher/p/1568792.html
Copyright © 2020-2023  润新知