[label][JavaScript][The Defined Guide of JavaScript] 变量的作用域

变量的作用域

一个变量的作用域(scope)是程序中定义这个变量的区域。

全局(global)变量的作用域(scope)是全局性的,即在JavaScript代码中,它处处都有定义。
    而在函数之内声明的变量,就只在函数体内部有定义,它们是局部(local)变量,作用域是局部性的。
    函数的参数也是局部变量,它们只在函数体内部有定义。
    在函数体内部,局部变量的优先级比同名的局部变量高。
    
    如果给一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,那么就有效地隐藏了这个全局变量。

例如,下面的代码将输出单词"local scope":
        var scope = ‘global scope‘;     // Declare global variable
            function checkScope() {
                var scope = ‘local scope‘;     // Declare a local variable with the same name
                document.write(scope);        // Use the local variable. not the global one
            }
            
            checkScope(); // Prints "local"
    注意:在全局作用域中编写代码是可以不使用var语句,但是在声明局部变量时,一定要使用var语句。
    
    没有块级作用域
    JavaScript没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有
    定义的。
    
    下面代码中,变量i、j和k的作用域是相同的,它们三个在整个函数体中有定义。
        funtion test(o) {
            var i = 0;         // i is defined throughout function
            if(typeof o == "object") { // if block
                var j = 0;    // j is defined everywhere, not just block
                for(var k = 0; k < 10; k++) { // k is everywhere, not just loop
                    document.write(k);    // k is still defined: prints 10
                }
            }
            document.write(j);    // j is defined, but may not be initialized
        }
        
        // Example-2
        
        var scope = ‘global‘;    
        function f() {
            alert(scope);    // Displayed "undefine", not "global"
            var scope = "local";    // Variable initialized here, but defined everywhere
            alert(scope);    // Displays "local"
        }
        //由于这个作用域规则的限制,第一个alert输出的并不是"global"。
        //局部变量在整个函数体内都是有定义的,这就意味着在整个函数体中都隐藏了同名的全局变量。
        //虽然局部变量在整个函数体中都是有定义的,但是在执行var语句之前,它是不会被初始化的。
        因此上面的例子中,函数f和下面的函数等价:
        
        function f() {
            var scope;    // 局部变量在函数开头声明
            alert(scope);    // 此处该变量有定义,但值仍为"undefined"
            scope = ‘local‘;     // 现在初始化该变量,并给它赋值
            alert(scope);    //此处该变量具有值
        }
        //这个例子说明了为什么将所有的变量声明集中起来放置在函数的开头是一个好的编程习惯。

以下内容来自: http://www.cnblogs.com/wangfupeng1988/p/3986420.html

Code 1:

console.log(a);   // variable a is undeclared and this will occure error reporting

Code 2:

console.log(a);   // undefined , declare a variable in JavaScript and not assign a value. Then the variable‘s default value is undefined.

var a;

Code 3:

console.log(a);  // undefied

var a = 10;

Code 4:

console.log(this);  // 这里输出将会是window对象,window对象是一个全局的对象

Code 5:

console.log(f1);  // function f1(){ }

function f1() { }; // 声明函数

Code 6:

console.log(f2) ;  // undefined

var f2 = function f2() { }; // 函数表达式,这种方式产生的效果和变量的声明并赋值一样

注意: 学过C、Java都知道,在使用一个变量之前必须要先声明数据类型,如: int a; 

同时,在声明变量的同时也可以初始化赋值,如: int a = 1001;

但是在程序的执行过程之中, 是先进行类型的声明的预处理,然后就是执行赋值,"="是赋值操作符。

 

时间: 2024-10-18 17:08:31

[label][JavaScript][The Defined Guide of JavaScript] 变量的作用域的相关文章

[label][JavaScript][The Defined Guide of JavaScript] 如何声明变量

因为觉得我自己的JavaScript基础很不扎实,或者可以说根本就没有所谓基础,所以就最近一直在看<The Defined Guide of JavaScript> . 在一边看的同时,我自己也做了一些阅读笔记,这些笔记内容都是来自于书中,我只不过将其中的一些内容摘录出来,准备以每一部分笔记的内容来作为题目发表到个人博客中. 变量的声明    在JavaScript程序中,使用一个变量之前,必须先声明(declare)它.    (如果不显式地声明一个变量,JavaScript将隐式地声明它.

精读《javascript高级程序设计》笔记二——变量、作用域、内存以及引用类型

变量.作用域和内存问题 执行环境共有两种类型——全局和局部 作用域链会加长,有两种情况:try-catch语句的catch块,with语句. javascript没有块级作用域,即在if,for循环中的变量,在块结束后,并不会被销毁. 最好能手工断开原生javascript对象与DOM元素之间的连接. Object类型 创建Object实例有两种方式:new 操作符后跟Object构造函数即new Object(),对象字面量表示法即用{}表示. 可使作方括号表示法来访问对象的属性,将要访问的属

JavaScript高级程序设计学习(三)之变量、作用域和内存问题

这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于java中涉及到jvm,因此可以自动垃圾回收和内存分配,而不需要手动. 一.变量 每个变量都有其类型,数据类型.在java中分基本数据类型和引用数据类型,js同样如此. 面试题:java的基本数据类型有哪些,及其所占字节?引用类型有哪些? java基本数据类型分别为int(4),float(4),dou

JavaScript读书笔记(4)-变量、作用域和内存问题

1.ECMAScript数据类型分为:基本类型值和引用类型值: ECMAScript中所有函数的参数都是按值传递的: 检查对象的类型:varible instanceof constructor Alert(person instanceof Object); 2.  执行环境和变量 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中: 全局执行环境是最外围的一个指定环境,在web浏览器中,全局执行环境是window对象,所有的全局变量和函数都是window对象

《JavaScript高级程序设计》读书笔记 ---变量、作用域和内存问题小结

JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Boolean.Number 和String.基本类型值和引用类型值具有以下特点:? 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中:? 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本:? 引用类型的值是对象,保存在堆内存中:? 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针:? 从一个变量向另一个变

javascript高程笔记-------第四章 变量、作用域和内存问题

首先JavaScript中的变量分为基本类型和引用类型. 基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象. 1.参数传递 javascript中所有参数的传递都是值传递. 1.1 基本数据类型的传递(undefined ,Null,Boolean,number,String) 1--->var money = 10; 2--->var t=function (money){ money = 5; alert(money); //5 }3--->t(mon

javascript高级程序设计第四章 变量、作用域和内存问题

变量包含两种,,基本类型和引用类型 基本类型是指一些简单的字段: 引用类型是?由多个值构成的对象  引用类型的值是保存在内存中的对象,在javascript中是不允许直接访问内存中的位置; 函数的参数是按照值类型进行传递的,函数的参数可以看作是一个局部变量. 检测类型: typeOf  用来检测基本类型的值用处大,在检测引用类型的值得时候用处不是很大  检测到的Null类型返回结果为Object, insctanceof 用来检测引用类型的值,当检测的对象是引用类型的值或者Object时返回tr

JavaScript学习(二):变量、作用域和内存问题

基本类型和引用类型的值 基本类型(简单的数据段) 基本数据类型是按值访问的,因为保存在变量中的是实际的值. 引用类型(可能由多个值构成的对象) 引用类型是保存在内存中的对象,JavaScript不允许直接访问内存中的位置.所以实际上是在操作对象的引用而不是实际的对象. 1.动态的属性 只能给引用类型值动态的添加属性. 2.复制变量值 因为基本类型和引用类型的访问方式不同,在复制变量的时候也会不同. 当从一个变量向另一个变量赋值基本类型的值的时候,会创建新值,然后把值复制到此位置. 当从一个变量向

JavaScript高级程序设计-第四章-变量、作用域和内存问题

ECMAScript变量 基本类型:5 引用类型 存于内存栈 实际对象位于内存堆 按值访问,可操作保存在变量中实际的值 js不能直接操作对象的内存空间,而是操作它的引用 不可添加属性和方法 可添加属性和方法 变量复制是一个实际的值,互不干扰 变量复制是一个指针,指向相同的对象,改变其中一个变量会影响另一个 Undefined   Null   Boolean   Number   String           variable typeof v v instanceof constructo