文档章节

Javascript:谈谈JS的全局变量跟局部变量

a
 abc45628
发布于 2017/01/20 17:03
字数 1064
阅读 10
收藏 0

今天公司一个实习小妹子问我两段JS代码的区别

<script type="text/javascript">
 var a = "Hello";
 function test(){
      var a;
      alert(a);
      a = "World";
      alert(a);
 }
</script>

<script type="text/javascript">
 var a = "Hello";
 function test(){
      alert(a);
      a = "World";
      alert(a);
 }
</script>

        我想,好简单呀,不就是全局变量跟局部变量的scope问题吗?我说:"当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope。所以两段代码运行的结果分别为:1) undefined World 2) Hello World。然后我随意编了如下一个例子给她:

<script>
    var a =1;
    function test(){
       alert(a);
       var a = 2;
       alert(a);
    }
    test();
    alert(a);
 </script>

        大家猜结果等于多少?是输出1 2 1 吗?嗯嗯,当我把测试case发给她之前也是这么认为的,但测试输出后……运行结果是 undefined 2 1。当时百思不得其解,问了谷老师才知道,我对JS还不是非常了解,所以痛下苦功,学习+测试,总结如下:

        一、Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)。切记,是function块,而for、while、if块并不是作用域的划分标准,可以看看以下几个例子:

<script>
function test2(){
    alert ("before for scope:"+i);    // i未赋值(并不是未声明!使用未声明的变量或函数全抛出致命错误而中断脚本执行)

                                                    // 此时i的值是underfined
    for(var i=0;i<3;i++){
        alert("in for scope:"+i);  // i的值是 0、1、2, 当i为3时跳出循环
    }
    alert("after for scope:"+i);  // i的值是3,注意,此时已经在for scope以外,但i的值仍然保留为3
    
    while(true){
        var j = 1;
        break;
    }
    alert(j);    // j的值是1,注意,此时已经在while scope以外,但j的值仍然保留为1

    if(true){
        var k = 1;
    }
    alert(k);  //k的值是1,注意,此时已经在if scope以外,但k的值仍然保留为1
}

test2();
//若在此时(function scope之外)再输出只存在于test2 这个function scope里的 i、j、k变量会发生神马效果呢?
alert(i); //error! 没错,是error,原因是变量i未声明(并不是未赋值,区分test2函数的第一行输出),导致脚本错误,程序到此结束!
alert("这行打印还会输出吗?"); //未执行
alert(j); //未执行
alert(k); //未执行
</script>

     二、Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域。怎么理解呢?看下面一个例子:

<script>
    var a =1;
    function test(){
        alert(a); //a为undefined! 这个a并不是全局变量,这是因为在function scope里已经声明了(函数体倒数第4行)一个重名的局部变量,
                     //所以全局变量a被覆盖了,这说明了Javascript在执行前会对整个脚本文件的定义部分做完整分析,所以在函数test()执行前,
                     //函数体中的变量a就被指向内部的局部变量.而不是指向外部的全局变量. 但这时a只有声明,还没赋值,所以输出undefined。
        a=4       
        alert(a);  //a为4,没悬念了吧? 这里的a还是局部变量哦!
        var a;     //局部变量a在这行声明
        alert(a);  //a还是为4,这是因为之前已把4赋给a了
    }
    test();
    alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值
</script>

        三,当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope,而当全局变量遇上局部变量时,怎样使用全局变量呢?用window.globalVariableName。

<script>
    var a =1;
    function test(){   
        alert(window.a);  //a为1,这里的a是全局变量哦!
        var a=2;     //局部变量a在这行定义
        alert(a);  //a为2,这里的a是局部变量哦!
    }
    test();
    alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值
</script>

转自http://blog.csdn.net/zyz511919766/article/details/7276089

© 著作权归作者所有

a
粉丝 1
博文 28
码字总数 12268
作品 0
东城
程序员
私信 提问
JavaScript的变量作用域

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

biGpython
2011/08/13
104
0
谈谈javascript语法里一些难点问题(一)

原文出处:夏天的森林 1) 引子 前不久我建立的技术群里一位MM问了一个这样的问题,她贴出的代码如下所示: JavaScript var a = 1; function hehe() { window.alert(a); var a = ...

夏天的森林
2014/12/10
0
0
现代 JavaScript 的变量作用域

原文链接:Variable Scope in Modern JavaScript 译者:OFED 现代 JavaScript 的变量作用域 当与其他 JavaScript 开发人员交谈时,令我经常感到惊讶的是,有很多人不知道变量作用域是如何在 ...

涂鸦码龙
2018/08/17
0
0
由 JavaScript 看闭包的概念

一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量...

猴亮屏
2015/08/12
86
0
【译】终极指南:变量提升、作用域和闭包

原文作者:Tyler McGinnis 原文链接:tylermcginnis.com/ultimate-gu… 文中部分链接可能需要梯子。 欢迎批评指正。 说出来可能吓你一跳,在我看来,理解Javascript的最重要最基本的思路就是...

👊Badd
2018/12/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
今天
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部