zoukankan      html  css  js  c++  java
  • Js整理备忘(01)—— 变量作用域

    1、变量类型

    Javascript(以下简写为Js)是非类型(untype)的,即没有类型规则,意味着Js的变量可以存放任意类型的值,并且在必要时可以快速、自动地进行类型转换。

    2、变量声明

    关键字var

    (1)用var声明一个变量并未赋值时,变量值为undefined;

    (2)用var多次声明同一个变量是合法的,重复的声明被视为赋值;

    (3)若尝试使用一个未声明变量的值,生成错误,Js有时并不会指出错误在哪里,这一点要自己注意。

    (4)尝试给一个未声明的变量赋值,Js则会隐式声明该变量,即创建为全局变量。

    3、变量作用域(scope)——作用域的概念比较重要,后面还有复杂的函数作用域

    全局(global)变量的作用域是全局,即在整个Js代码中都有定义;而局部(local)变量是函数内部声明的变量,作用域是整个函数体。

    若全局变量和局部变量同名,则导致该全局变量在该局部变量所在函数体的作用域内隐藏,函数只使用这个局部变量。

    例,将下面的代码放到一个空html页面的<body></body>中直接运行。

    <script type="text/javascript">
        var scope = "global";
        function f() {
            var scope = "local";
            document.write(scope);       // "local"
        }
        f();
        document.write(";" + scope);
    </script>  
    结果输出local;global,可见函数f()内部的scope与全部变量的scope是相独立的,同名的全局变量只是被隐藏了而已。
    此处要注意,声明局部变量时一定要使用var语句,否则有可能达不到预期效果,将代码稍微修改如下。
    <script type="text/javascript">
        var scope = "global";
        function f() {
            //var scope = "local";
            scope = "local";        //若这么写,就是修改全局变量scope了
            document.write(scope);
        }
        f();
        document.write(";" + scope);
    </script>  

    结果输出local;local,全局变量被修改了。

    另外还要注意的事,Js中没有块级作用域的概念,如while、for等块中的循环变量,作用域便是其所在的整个函数。

    4、作为属性的变量

    明确一点,Js中变量基本上和对象的属性是一样的。

    (1)全局变量是全局对象(global object)的属性

    全局对象:Js解释器开始运行时,首先做的事情之一就是创建一个全局对象,当声明一个全局变量时,该变量实际上就成为了全局对象的一个属性。

    (2)局部变量是调用对象(call object)的属性

    函数的概念是具有可执行代码的对象,可见函数本质也是对象。

    调用对象:在执行一个函数时,函数的参数和局部变量都是作为调用对象的属性存储的。

    5、Js代码的执行环境

    Js解释器每次执行一个函数时,都会为其创建一个执行环境(execution context),所有的Js函数都运行在自己独特的环境中,具有自己的调用对象。

    运行不属于任何函数的Js代码的环境就使用全局对象。

    注意:

    Js的实现允许多个全局执行环境,每个执行环境有不同的全局对象。(但此时每个全局对象就不全是全局的了)

    例如:第一个帧中的Js代码可以用parent.frames[1].x来引用第二个帧中的全局变量x;而第二个帧中的代码可以用parent.frames[0].x来引用第一个帧中的全局变量x。

    (涉及到Js和Web浏览器的集成,后面再介绍,此处不多说)

    此外,这一特性也带来了安全性的问题。例如来自某个Internet站点的脚本试图访问局域网内的某个窗口,可能造成该局域网内信息被窃取。

    至于如何解决这一问题,不在此处介绍。

  • 相关阅读:
    Pivot Table 实现详解(一)
    VSTS 离线源码版本辅助工具
    早上发现还是问题不断
    VSTS 离线源码版本辅助工具源码
    C#单元测试
    长沙招聘若干 ASP.NET 开发人员(长期有效)
    解析判定数据有效性表达式的存储过程 for SQLServer
    提高 SNAP 网页预览图的采集速度
    用了2年多快3年的老ASUS本子出了点小问题了
    模拟一下细胞的繁殖(CSDN号召帖)
  • 原文地址:https://www.cnblogs.com/gppblog/p/1643921.html
Copyright © 2011-2022 走看看