`

JavaScript之变量的作用域

阅读更多

1、JavaScript的作用域链
2、函数体内部,局部变量的优先级比同名的全局变量高。
3、JavaScript没有块级作用域。
4、function hoisting
5、未使用var关键字定义的变量都是全局变量。
6、全局变量都是window对象的属性





1、JavaScript的作用域链
首先看下下面这段代码:
<script type="text/javascript">  
    var rain = 1;  
    function rainman(){  
        var man = 2;  
        function inner(){  
            var innerVar = 4;  
            alert(rain);  
        }  
        inner();    //调用inner函数  
    }  
    rainman();    //调用rainman函数  
</script> 

观察alert(rain);这句代码。JavaScript首先在inner函数中查找是否定义了变量rain,如果定义了则使用inner函数中的rain变量;如果inner函数中没有定义rain变量,JavaScript则会继续在rainman函数中查找是否定义了rain变量,在这段代码中rainman函数体内没有定义rain变量,则JavaScript引擎会继续向上(全局对象)查找是否定义了rain;在全局对象中我们定义了rain = 1,因此最终结果会弹出'1'。

作用域链:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义x变量,JavaScript会继续查找有没有定义x变量,如果第二个对象没有定义则会继续查找,以此类推。

上面的代码涉及到了三个作用域链对象,依次是:inner、rainman、window。


2、函数体内部,局部变量的优先级比同名的全局变量高。

<script type="text/javascript">  
    var rain = 1;    //定义全局变量 rain  
    function check(){  
        var rain = 100;    //定义局部变量rain  
        alert( rain );       //这里会弹出 100  
    }  
    check();  
    alert( rain );    //这里会弹出1  
</script>
 



3、JavaScript没有块级作用域。
这一点也是JavaScript相比其它语言较灵活的部分。
仔细观察下面的代码,你会发现变量i、j、k作用域是相同的,他们在整个rain函数体内都是全局的。
<script type="text/javascript">  
    function rainman(){  
        // rainman函数体内存在三个局部变量 i j k  
        var i = 0;  
        if ( 1 ) {  
            var j = 0;  
            for(var k = 0; k < 3; k++) {  
                alert( k );    //分别弹出 0 1 2  
            }  
            alert( k );        //弹出3  
        }  
        alert( j );            //弹出0  
    }  
</script>


4、function hoisting
在function中声明的局部变量,会被hoisting到当前作用域的顶部,赋值部分位置不变。
首先观察这段代码:
<script type="text/javascript">  
    var x = 1;  
    function rain(){  
        alert( x );        //弹出 'undefined',而不是1  
        var x = 'rain-man';  
        alert( x );        //弹出 'rain-man'  
    }  
    rain();  
</script>  

上面的rain函数等同于下面的函数:
<script type="text/javascript">
    var x = 1;
    function rain(){  
        var x; //函数体内定义的局部变量x,被 hoisting 到了函数的顶部
        alert( x );  
        x = 'rain-man';  
        alert( x );  
    } 
</script>  

这里之所以会弹出'undefined'是因为,第一个执行alert(x)时,局部变量x仍未被初始化。


5、未使用var关键字定义的变量都是全局变量。
<script type="text/javascript">  
    function rain(){  
        x = 100;    //声明了全局变量x并进行赋值  
    }  
    rain();  
    alert( x );    //会弹出100  
</script>  

这也是JavaScript新手常见的错误,无意之中留下的许多全局变量。


6、全局变量都是window对象的属性
<script type="text/javascript">  
    var x = 100 ;  
    alert( window.x );//弹出100  
    alert(x);  
</script>  

等同于下面的代码
<script type="text/javascript">  
    window.x = 100;  
    alert( window.x );  
    alert(x)  
</script>  



—————————————

javascript 函数基础系列文章

1、JavaScript之变量的作用域
2、javascript之变量类型与变量声明及函数变量的运行机制
2.1、javascript 之 undefined
3、javaScript之function定义
4、javascript之function的prototype对象
5、javascript之function的(closure)闭包特性
6、javascript之function的this   
7、javascript之function的apply(), call()



___________


javascript 面向对象编程系列文章:

    1、javaScript之面向对象编程
    2、javascript之面向对象编程之属性继承
    3、javascript之面向对象编程之原型继承 
   

-




转载请注明,
原文出处:http://lixh1986.iteye.com/blog/1955314









引用:

深入理解JavaScript的变量作用域
一 类型,值 和 变量
理解 JavaScript 的变量作用域










-
分享到:
评论

相关推荐

    javascript变量作用域

    JavaScript 变量作用域详解 JavaScript 变量作用域是基于其特有的作用域链的。在 JavaScript 中,变量作用域是指变量可以被访问和修改的范围。 JavaScript 没有块级作用域,而是基于函数作用域和全局作用域的。 ...

    基于JavaScript的变量作用域的辨析.pdf

    变量作用域是JavaScript编程过程中经常遇到的问题之一,对于编程人员来说是一个困扰的问题。变量的主要作用是存取数据、提供存放信息的容器。变量的一个重要特性之一就是变量的作用域。所有面向对象的编程语言都有...

    理解JavaScript变量作用域.pdf

    理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com

    js变量作用域

    ### JavaScript 变量作用域详解 #### 一、引言 在探讨JavaScript的面向对象特性之前,理解变量作用域的概念至关重要。本篇文章旨在通过一系列示例和解释,帮助读者掌握JavaScript中的变量作用域机制。 #### 二、...

    深入理解变量作用域

    本文将从JavaScript权威指南出发,深入探讨变量作用域的相关知识点,包括全局作用域、局部作用域、以及闭包等高级概念。 #### 二、全局作用域与局部作用域 1. **全局作用域** - 定义:在JavaScript中,如果一个...

    JavaScript程序设计变量作用域共4页.pdf.zi

    本文将深入探讨JavaScript中的变量作用域,以及它如何影响代码的运行和组织。 首先,我们来理解什么是变量作用域。在JavaScript中,变量作用域决定了变量在何处可以被访问和识别。主要有三种类型的作用域:全局作用...

    JavaScript程序设计-变量作用域.pdf

    JavaScript是一种广泛用于网页和网络应用的编程语言,其核心特性之一就是变量作用域。变量作用域决定了变量在何处可以被访问以及何时会被销毁。本文将深入探讨JavaScript中的全局变量、局部变量、变量提升、词法作用...

    JavaScript 基础函数_深入剖析变量和作用域

    JavaScript是一种广泛用于网页开发的脚本语言,它的函数和作用域是实现代码逻辑结构和模块...理解JavaScript中的变量作用域非常重要,它有助于避免变量命名冲突和意外的变量修改,从而编写出更加健壮和易于维护的代码。

    JavaScript的变量作用域深入理解

    在学习JavaScript的变量作用域之前,我们应当明确几点: a、JavaScript的变量作用域是基于其特有的作用域链的。 b、JavaScript没有块级作用域。 c、函数中声明的变量在整个函数中都有定义。 1、JavaScript的作用域链...

    一道关于JavaScript变量作用域的面试题_.docx

    JavaScript变量作用域是编程语言中一个非常核心的概念,它决定了变量在何处可被访问以及其生命周期。在这道面试题中,我们看到的是如何在不同作用域下声明和使用变量,特别是与for循环相结合的情况。 首先,我们要...

    深入理解JavaScript作用域和作用域链

    JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性及生命周期。JavaScript主要有两种作用域:全局作用域和局部作用域。 全局作用域是指在代码的任何位置都可以访问的变量或函数,这通常包括在最...

    Javascript中的作用域及块级作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: a、JavaScript的变量作用域是基于其特有的作用域链的。 b、JavaScript没有块级作用域。 c、函数中声明的变量在整个函数中都有定义。  javascript的变量作用...

    JavaScript变量的作用域全解析

    变量作用域是程序中定义这个变量的区域。 先来看一段示例: /* 代码1 */ var scope = "global "; function checkScope() { var scope = "local "; function childCheck() { var scope = "childLocal "; ...

    【JavaScript源代码】JavaScript高级程序设计之变量与作用域.docx

    JavaScript是一种广泛应用于网页和网络应用的脚本语言,它的核心特性之一是变量和作用域的概念。在深入探讨这些概念之前,我们先理解一下原始值和引用值的区别。 1、原始值与引用值 JavaScript中有六种原始数据...

    javascript执行环境,作用域理解

    执行环境是一个概念,一种机制,用来完成 JavaScript 运行时在作用域、生存期等方面的处理,它定义了变量或函数是否有权访问其他数据,决定各自行为。 一、执行环境(Execution Context) 在 JavaScript 中,所有...

    理解JavaScript变量作用域更轻松

    JavaScript变量作用域是编程基础中的重要概念,它决定了变量在哪些范围内可以被访问。了解变量作用域可以帮助开发者更好地管理代码中的数据,防止意外的变量冲突,从而提高代码的稳定性和可维护性。 JavaScript中...

    深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx

    深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...

    Javascript的词法作用域分析.pdf

    Javascript中的词法作用域分析是指变量的作用域不是在执行时决定的,而是在定义时决定的,也就是说通过静态分析就能确定。因此,词法作用域也叫做静态作用域。 在Javascript中,一个方法的词法作用域是指该方法在...

    深入解析JavaScript中的变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: •JavaScript的变量作用域是基于其特有的作用域链的。 •JavaScript没有块级作用域。 •函数中声明的变量在整个函数中都有定义。 1、JavaScript的作用域链...

Global site tag (gtag.js) - Google Analytics