注册 登录
编程论坛 JavaScript论坛

头大的声明+作用域+生命期

发布于 2008-06-12 19:51, 1878 次点击
这个问题很常见,在我们声明变量的时候就要遇到,但是一般我们都不太重视,一个var(dim)就过去了,但是如果深究这个问题涉及到asp、vbscript、javascript,还有var(dim)、public、private、作用域、生命期,所有这些概念相互关联,让人头大!

现在我搞不清楚:
1、到底是“javascript里没有public和private,在vbscript里面有”,还是“script里面没有public和private,在asp里面有”
2、不管上面的问题,答案是哪一个,我都要问,没有的那个真的不需要public和private吗?还是说各自有相应的方法?
2、在javascript里面如果不用var声明,就相当于public?
3、在vbscript里面,过程内外同名变量,如果过程内的没有声明,就和过程外的变量为同一变量;如果声明了,就和外面的变量没有任何关系?javascript里面也是这样吗?
4、有的地方说作用域就是生命期,但是有的地方说作用域和生命期是两回事--记得以前看到过一篇文章,里面提到在不同的位置使用public和private,可以有多种作用域和生命期的组合,有的影响作用域,有的影响生命期,具体文章现在找不到了

我已经晕了,我已经说不清楚了,大虾们应该能理解我要表达的意思吧?
这应该是个最基础的问题,还请各位大虾给通透的说说
9 回复
#2
2008-06-13 01:11
自己想了一些,也实验了一下,是不是这样:
1、"在javascript里面如果不用var声明,就相当于public?"这句话应该是对的,javascript里只有public和过程变量,没有像private那样的文件变量
--不过还是不清楚vbscript在客户端编程时能不能用public和private(没看到过这方面的例子),但是在ASP里是有的,还要向大虾们求证(是不是因为只有在ASP环境下才支持inc,public才有的发挥啊?也就是说尽管vbscript在客户端编程也支持public、private的声明,但是因为不能引入文件,而不能把这个特征体现出来啊?是这样吗?)
2、在vbscript里面,过程内外同名变量,如果过程内的没有声明,就和过程外的变量为同一变量;如果声明了,就和外面的变量没有任何关系?javascript里面也是如此!
3、倾向于只有vbscript才有作用域和生命期,但是说不太清楚,可以因为javascript的对象概念更强,而且javascript可以嵌套函数定义等等的特性,没有必要使用public、private了吧?

[[it] 本帖最后由 nbh002 于 2008-6-13 01:21 编辑 [/it]]

[[it] 本帖最后由 nbh002 于 2008-6-13 01:26 编辑 [/it]]
#3
渚薰2008-06-13 09:07
首先,你完全理解错了js的变量作用域的范围和概念,所以导致了你的混乱。
1、在js中,变量的作用域是函数作用域,而不是块作用域,即,在一个函数中声明的变量,在整个函数中都可见,但在其他函数中不可见。

举例:(以高级语言c/c++/java为例)
块作用域的产生是有块{}中定义的变量只在块中可见,在其他块或块外不可见,比如
for (int i = 0;i < 10;i++) {
}

此时的i只在for循环体中可见

而js中,因为是函数作用域,所以
for (var i=0;i<10;i++) {}
中的i在循环所处的函数体内都可见

2、js没有public和private限定,只有变量都是public,都是函数作用域中的public

3、你所指的函数外,其实存在一个global作用域,可以简单的理解成全局作用域,其中定义的变量,可理解成为全局变量,但其实,在js中,由于所有皆对象,函数也是对象,所以一个函数是可以定义在另一个函数体内,并使用,这样就造成父函数中定义的变量在子函数中是可见的,但是子函数中定义的变量在父函数中是不可见的,即

function a() {
   var ina = 1;
   
   var b = function() {
      var inb = 2;
      alert(ina);   //输出1
   }

   b();
   
   alert(inb)  //输出undefiend
}

3、同样,函数作用域内的变量定义会隐藏函数作用域外变量的定义
#4
2008-06-13 15:10
恩,对于JS的倒是理解了,不过VBS和JS的区别真是太大了
现在是搞不清VBS了,而ASP又是用的VBS编写的,真头大
专门针对剩下的VBS问题发了一帖
https://bbs.bccn.net/viewthread.php?tid=218992&extra=page%3D1&frombbs=1
斑竹,有没有考虑过js的生命期的问题?
#5
渚薰2008-06-16 08:29
生命周期就是作用域中变量的行为
#6
yms1232008-06-16 11:05
楼主所说的涉及OOP(面向对象的知识),而像VBScript或Javascript的面向对象特性并不十分明显或者说支持的不是很好。如果楼主没有学习过面向对象的知识,建议学习面向对象不要从vbscript或javascript来入手,原因上面已经说了。楼主可以选择从完全面向对象的一种语言入手,之后再来学习vbscript或javascript的面向对象知识就很好理解了。推荐的比较好的面向对象语言(C++、java、C#),个人是先学习的C++,然后学习的java,之后是C#。这样的路径在于java是C++基础上发展而来,学习了C++之后与java对比学习就会很好理解某些面向对象的特性。而C#是向升级的一种语言与java有很多相似的地方,同时也有一些C#独特的不同点。
学完这些面向对象语言之后,楼主再来理解VBScript或Javascript的面向对象,就会与那些语言产生一个比较,就会明白为什么说vbscript或javascript面向对象支持的不是很好。
#7
2008-06-16 12:18
谢谢2位斑竹,对面向对象一直比较模糊,学习高级语言是一定的,不过也是以后的事,现在主要想做出象样的网站
#8
hugeannex2008-06-16 13:02
哎,搞得这么复杂,用过就懂了,想这么多,而且想一脚踏两船。
#9
kevintang2008-06-20 13:17
学习
#10
sansiwu2009-10-12 15:54
按我的理解,也不想要理解这么的深入透切和复杂,也不想要用那么多时间来正确理解.把 Public 和 Private 当作一个最通俗的意义和作用理解就是了.
Public:相当于定义一个默认的变量,亦为一个公用的全局的声明变量;
Private:相当于定义一个新的变量,亦为一个新的小范围的声明变量.
嗯,也不知是错或对?
1