首页 > 编程语言 >深入理解JavaScript的变量作用域

深入理解JavaScript的变量作用域

时间:2023-05-19 17:04:15浏览次数:45  
标签:变量 作用域 JavaScript rain alert var 函数


一篇整理的不错的文章。


 

 

深入理解JavaScript的变量作用域



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

在学习JavaScript的变量作用域之前,我们应当明确几点:

  • JavaScript的变量作用域是基于其特有的作用域链的。
  • JavaScript没有块级作用域。
  • 函数中声明的变量在整个函数中都有定义。



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、函数中声明的变量在整个函数中都有定义。

首先观察这段代码:


<script type="text/javascript">
    function rain(){
        var x = 1;
        function man(){
            x = 100;
        }
        man();        //调用man
        alert( x );    //这里会弹出 100
    }
    rain();    //调用rain
</script>


上面得代码说明了,变量x在整个rain函数体内都可以使用,并可以重新赋值。由于这条规则,会产生“匪夷所思”的结果,观察下面的代码。


<script type="text/javascript">
    var x = 1;
    function rain(){
        alert( x );        //弹出 'undefined',而不是1
        var x = 'rain-man';
        alert( x );        //弹出 'rain-man'
    }
    rain();
</script>


是由于在函数rain内局部变量x在整个函数体内都有定义( var x= 'rain-man',进行了声明),所以在整个rain函数体内隐藏了同名的全局变量x。这里之所以会弹出'undefined'是因为,第一个执行 alert(x)时,局部变量x仍未被初始化。

所以上面的rain函数等同于下面的函数:



function rain(){
    var x;
    alert( x );
    x = 'rain-man';
    alert( 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,rain,alert,var,函数
From: https://blog.51cto.com/u_2700990/6313967

相关文章

  • Path环境变量
    一文搞懂Path环境变量 什么是Path环境变量?在探讨这个问题之前,我们需要了解什么是环境变量。“环境变量”和“path环境变量”其实是两个东西,这一点大家一定要区分开,不要混为一谈。“环境变量”是操作系统工作环境设置的一些选项或属性参数。每个环境变量由变量名和文件路径......
  • JavaScript学习笔记: 函数
    概念在js中,函数与其他类型一样,是一个支持所有操作的值,是一个对象,是编程语言里的“一等公民”函数是一个代码块,每被调用一次,其代码就会执行一次。函数有一个被{}包裹的函数体,具体的逻辑代码就写在里面。使用return关键字返回函数的计算结果,如果没有返回值,那函数调用表达式的值......
  • JavaScript split() 方法
    定义和用法:split()方法用于把一个字符串分割成字符串数组。stringObject.split(separator,howmany)其中:separator必需。字符串或正则表达式,从该参数指定的地方分割stringObject。howmany可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指......
  • less在vue项目中的全局变量设置
    1,使用全局变量的目的:sass或者less都提供变量设置,在需求切换主题的项目中使用less或者sass变量,只要修改变量值,编译后所有用到该变量的样式都会被修改为你想要的效果2,安装sass-resources-loadernpminstallsass-resources-loader--save-dev3,找到build文件夹下面的utils.jsreturn{......
  • Tensorflow变量管理及模型持久化,实现实现线性回归
    变量管理随着神经网络的结构更加复杂,参数更多时,需要一个更好的方式来传递和管理变量。在TF中提供了通过变量的名字来创建或者获取一个变量的机制,通过这个机制不同函数可以直接通过变量的名字来直接使用变量。这机制主要是通过tf.get_variable和tf.variable_scope实现的。tf.get_......
  • JavaScript
    二、JavaScript1、JavaScript介绍JavaScript语言诞生主要是完成页面的数据验证。因此它运行在客户端,需要运行浏览器来解析执行JavaScript代码。JS是Netscape网景公司的产品,最早取名为LiveScript;为了吸引更多java程序员,更名为JavaScript。JS是弱类型,Java是强类型。弱类型就是类......
  • python os.environ操作环境变量
    1、.env文件数据添加到环境变量load_dotenv(ROOT_DIR+'/.env',verbose=True)或load_dotenv(find_dotenv('.env')2、新增环境变量,其中key和value均为string类型os.environ['环境变量名称']='环境变量值'  环境变量立刻生效,从设置开始后面的运行部分都能获取到该变量os.e......
  • 深入理解之JavaScript之call, apply, bind方法
    在JavaScript中,call、apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数执行时的上下文,再具体一点就是改变函数运行时的this指向。Function.prototype.call()call()方法调用一个函数,其具有一个指定的this值和多个参数(参数的列表)。fun.call(thisArg,a......
  • javascript小技巧(六)
    操作EXECL<scriptlanguage="javascript">functionjStartExcel(){varxls=newActiveXObject("Excel.Application");xls.visible=true;varnewBook=xls.Workbooks.Add;newBook.Worksheets.Add;newBook.Worksheets(1).Activa......
  • 作用域运算符
    目前已经学过了作用域运算符的两个作用1.调用类中静态成员函数classPerson{public:staticintm_person;};intmain(){Person::m_person;}2.类内用typedef或则using起类型别名,在类外使用该类型别名时:classPerson{public:usingpi=int;};int......