javascript变量:全局?还是局部?这个得注意!

做项目就是一个学习的过程!

做为一个学习C3年多,从C程序员转前端的人来说,javascript中的许多规则是没办法或者说一时半会理解不了的。

今天就遇到了一个,大致就是这么个代码。

var a ;                         //全局变量
function fun()
{
    alert(a);               // a 在其它地方赋值,在这里操作,比如赋值为 0      ------------- 1
    if(a==0)
    {
       alert(a);        // ----------------2
       a = 10;
    }
    var a = 5 ;          // 重新定义变量
    alert(a);             // -----------------3
}
function fun2()
{
    alert(a)            // ------------------4
}
//  先执行了赋值,然后执行fun(),执行fun2();

结果第2处的操作怎么都进入不了,于是打出第1处直接 a 的值是: undefined !,我C,这是什么情况?

可能是C的理论,在脑海里扎的太深了,想了很久也想不明白为什么,只好在网上查,还好不是我一个人遇到这样的问题,在网上查了三篇文章。

javascript 变量范围

(1)全局变量的作用域是全局性的,即在整个Javascript程序中,全局变量作用处处都存在。定义在”script”块中,在”function”函数外。
(2)局部变量的作用域是局部性的,在函数内部或函数参数时定义,作用范围是从函数开始到结尾(注意此处说法)
(3)在函数内部,局部变量的优先级比同名的全局变量优先级要高;如果存在与全局变量名称相同的局部变量(包括参数),那么该全局变量将不再起作用。

看到这个的时候,我貌似有点点明白了。

也就是说我在 标注3 处的定义,跟放在fun第一行定义没有区别的,因为只要函数内部定义了,它的作用范围就是从开始到结尾(定义时候没有赋值,所以Undefined)。

顺便又看了一些深一点的知识。

JavaScript语言块的范围跟其它(比如C)是不同的,它是用function来划分的,称为方法块(是根据后面的{}来划分)。

也就是说for,while,等内部定义的变量,虽然有{},但出了{},还是有效的。

例:q,x,y,z 分别在函数的不同位置定义,但他们的作用范围是相同的,都相当于在函数开始定义的,好神奇,也好TMD的难理解呀,有么有?

function test(q)
{
       // 在整个函数中,x都有意义
       var x=0;
       if(typeof(q)=="object")
      {
           //y不仅在if块中有意义,在整个函数中都有意义
          var y=0;
         for(var z=0;z<5;z++)
        {
                //z不仅在for循环中有意义,在整个函数中都有意义
                 document.write(z);
         }
         document.write(z);             //z仍旧有意义,输出5
      }
      document.write(y);                //y仍旧有意义
}        

// 问题:如果在这里 alert(x) 会怎么样呢?

根据上面的三点应该很容易看出来:如果在函数外面 alert(x) ,会出现致命错误,脚本停止!因为x在函数外面是没有定义的。

那么,当局部变量与全局变量重名时候,怎么获取全局变量的值呢?

哈哈,最简单的当然是避免全局变量与局部变量相遇咯!

此外,用window.全局变量名

例子:

<script>
    var a =0;         // 全局a定义
function test(){     
        alert(window.a);  //a为1,这里的a就取的是全局变量
        var a=2;     //局部变量a定义
        alert(a);     //a为2,这里的a是局部变量!
    }      test();
   alert(a);          //全局的a,当然也可以用window.a
</script>

至此,问题也算搞明白了!

时间: 2024-10-11 21:30:23

javascript变量:全局?还是局部?这个得注意!的相关文章

[ python ] 全局和局部作用域变量的引用

全局与局部变量的引用 (a)locals(b)globals 这里还需要在补充2个关键字一起比较学习,关键字:(c)nonlocal(d)global locals 和 globals locals: 打印当前可用的变量的字典    globals: 返回一个描述当前全局变量的字典 提示:locals 是获取当前的可用变量,而 globals 是获取全局的变量 在使用 locals() 和 globals() 会出现以下三种表现形式: (1)当locals 和 globals 都在全局作用域的时

js变量搜索(先局部,后全局;先解析,后赋值)

var a=10; (function(){ alert(a); //10 })() 变量先搜索局部,没有局部变量,会搜索全局变量 var a=10; (function(){ var a=20; alert(a); //20 })() var a=10; (function(){ alert(a); //undefined var a=20; })() js中的变量是先解析然后再赋值,function中第一次搜索有a,值为undeifned

javascript 变量,作用域,内存管理小结

js的变量保存两种类型的数据——基本数据类型与引用类型.具有以下几点特征:   变量: 1)基本类型值在内存中占固定大小的空间,因此被保存在栈内存中; 2) 把保存基本类型值得变量赋给另一个变量,会创建这个值的副本; 3) 引用类型的值是对象,存在堆内存中; 4) 变量不会保存对象,只是创建了新的指针指向该对象,对象始终在堆内存中; 5) 指向对象的变量复制给一个新的变量,只是复制了指向对象的指针,最后两个变量都指向该对象; 6)  查看变量属于哪种基本类型得用typeof操作符,查看变量是哪种

2015第35周五JavaScript变量

java语言里有一句很经典的话:在java的世界里,一切皆是对象. Javascript虽然跟java没有半点毛关系,但是很多会使用javascript的朋友同样认为:在javascript的世界里,一切也皆是对象. 其实javascript语言和java语言一样变量是分为两种类型:基本数据类型和引用类型. 基本类型是指:Undefined.Null.Boolean.Number和String:而引用类型是指多个指构成的对象,所以javascript的对象指的是引用类型.在java里能说一切是对

javascript变量声明带var和不带var的区别

javascript变量声明带var和不带var的区别:在javascript中,声明变量可以使用var也可以不用使用var,下面就介绍一下这两者的区别.一.作用域的区别:不使用var声明的变量的作用域是全局性的,无论是否声明在函数的内部.使用var声明的变量的时候,如果是在函数外部声明的那么就是全局性的,在函数内部声明的就是局部变量.代码实例: <script type="text/javascript"> var a; function fun() { var b; c

第一百零六节,JavaScript变量作用域及内存

JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 一.变量及作用域 1.基本类型和引用类型的值 ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是那些保存在栈

JavaScript 变量、作用域和内存问题

按照ECMA-262第三版的定义,JavaScript的变量与其他语言的变量有很大区别.JavaScript变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型的规则,变量的值及其数据类型可以在脚本的生命周期内改变.尽管从某种角度看,这可能是一个既有趣又强大,同时又容易出问题的特性,但JavaScript变量实际的复杂程度还远不止如此. 1,基本类型和引用类型的值 ECMAScript变量可能包含两种不同类型的值:基本类型值和引用类

JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识

在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量.变量可以是局部或者全局性的,但在子范围中定义的变量是可以访问父范围的,这一点可能会造成一些困扰. 在JavaScript中使用"var"关键字声明变量.一旦在父范围宣声明,就会作为各自子范围的一部分.即在本地范围内有效,但本地定义的变量不可在全局范围内访问. 让我们来看一个例子.执行下面

JavaScript变量、作用域和内存问题(一)

接下来博客的内容 理解基本类型和引用类型的值 理解执行环境 理解垃圾收集 按照 ECMA-262 的定义,JavaScript 的变量与其他语言的变量有很大区别.JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变.尽管从某种角度看,这可能是一个既有趣又强大,同时又容易出问题的特性,但 JavaScript 变量实际的复杂程度还远不止如此. 基本类型和引用

JavaScript变量、作用域和内存问题总结

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