原来JScript中的关键字'var'还是有文章的 (zt)

都不记得是什么时候看的JScript的语法教程了,里面说在声明变量时忽略 var关键字是完全合法的。当时也因为觉得JavaScript是loosely-typed的语言,所以var可能真的就是个摆设。但是事实常常又证明想当然的结果是不可靠的

    看看下面这几个例子的结果就知道问题了:

    No.1

 

 

< script  language ="javascript" >
var var00 = 0;
document.write(var00 
+ '<br>');

var var01 = 1;
function foo()
{
    document.write(var01); 
    
var var01 = 1;
}

foo();
</ script >

 


    No.2

 

< script  language ="javascript" >
var00 
= 0;
document.write(var00 
+ '<br>');

var01 
= 1;
function foo()
{
    document.write(var01); 
    var01 
= 1;
}

foo();
</ script >

 


    No.3

 

< script  language ="javascript" >
var00 
= 0;
document.write(var00 
+ '<br>');

var01 
= 1;
function foo()
{
    document.write(var01); 
    
var var01 = 1;
}

foo();
</ script >

 


    这三个例子的执行结果分别是:

 

#region Results
No.
1
0
undefined

No.
2
0
1

No.
3
0
undefined
#endregion

 

     原来JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。在第二个例子中得到0和1,是因为所有的变量都是全局变量,而且那个语句块一共就定义了两个变量。而第一个第三的函数外全局变量,确实说明var关键字有没有都没有关系。而函数内的var关键字就很关键了,它说明第二个var01是函数内的变量,所以在初始化var01前输出自然就是'undefined'了。

     那么函数里面是不是就屏蔽掉了全局的var01了呢?我们知道在C/C++可以使用::去访问全局变量,那么JavaScript可不可以呢?这里其实我们只要明白了全局变量到底是什么东西,就好弄了。原来全局变量都是动态添加到Window对象的实例window上的属性而以,所以我们只要在函数内用:document.write(window.var01);就可以取到其值1了。同时在这个上下文中,function内的this也是指向的window实例,我们也可以把引用写成:this.var01。

    By the way, 重看JScript教程时,它说变量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'却也可以作为变量名字符,而且还可以用在开头,比如:$1234,更甚至于:$$$ 也是合法的变量名,faint。

posted on 2005-01-26 23:32 birdshome 阅读(2537) 评论(19)  编辑 收藏 收藏至365Key 所属分类: JScript&DHTML开发

# re: 原来JScript中的关键字'var'还是有文章的  回复   

哦,还有这样的说法阿
2005-01-27 03:15 | robaggio

# re: 原来JScript中的关键字'var'还是有文章的  回复   

兄台,如果Js没有运行于IE宿主上的时候全局变量如何处理的呢?

我先试试啊。
2005-01-27 09:05 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

如下,怎样在foo中取得foo外面的tmp?

var  tmp  =   1 ;

function  foo()
{
    
var  tmp  =   2 ;
    
return  tmp;
}

WScript.Echo(
" foo: "   +  foo());
WScript.Echo(
" global: "   +  tmp);
2005-01-27 09:15 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

我想知道是不是.在调用一个函数时,程序执行顺序会先检查函数内部变量中,有没有关键字var. 然后中再根据检查结果给不同的变量付予不同的作用域和变量值.因为我看到在这三个函数中,var01变量都是在输出语句之后.
2005-01-27 09:39 | 自由哥哥之青春不老哥

# re: 原来JScript中的关键字'var'还是有文章的  回复   



function get_global_var(___name)
{
return eval(___name);
}
function set_global_var(___name,___value)
{
eval(___name+"=___value");
}


var aa=11;
Test();
WScript.Echo(aa);//22

function Test()
{
var aa=33;

WScript.Echo(get_global_var("aa"));//11
set_global_var("aa",22);
WScript.Echo(get_global_var("aa"));//22

WScript.Echo(aa);//33
}


更多的可以参考我的一篇老文章:
http://www.csdn.com.cn/web/2088.htm
2005-01-27 09:47 | Lostinet

# re: 原来JScript中的关键字'var'还是有文章的  回复   

......看来除了这种方法没啥其他的了,不知楼主有啥想法。
2005-01-27 11:25 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

var aa=11;
Test();
WScript.Echo(aa);//22

function Test()
{
  var aa=33;
  WScript.Echo(this.aa);//11
  this.aa = 22;
  WScript.Echo(this.aa);//22
  WScript.Echo(aa);//33
}
2005-01-27 11:48 | birdshome

# re: 原来JScript中的关键字'var'还是有文章的  回复   

var aa=11;
Test();
WScript.Echo(aa);//22

function Test()
{
  var aa=33;
  WScript.Echo(this.aa);//11
  this.aa = 22;
  WScript.Echo(this.aa);//22
  WScript.Echo(aa);//33
}

WScript.Echo(new Test().aa);


这是何解呢?真被Script搞糊涂了。这样一说那个this又指Test,又指global了?
2005-01-28 09:52 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

  在上面的例子中this从来就没有指过Test,而一直都是WScript的实例。
  如果我们写一个语句:var test = new Test(); 这时Test里的this就是指的Test的一个实例了,这个实例中如果要使用Global的变量,Lostinet给出的是一个方法。
  不过最简单还是把global传入对象,这样定义Test:
  function Test(global)
  {
    // ...
  }
  然后这样创建实例:var test = new Test(this); 就可以在Test实例中使用global的对象和属性了。
2005-01-28 10:53 | birdshome

# re: 原来JScript中的关键字'var'还是有文章的  回复   

是不是这样,在new的实例中,this就指实例,否则都指WScript?
 
如果这样的话,换了脚本引擎,是不是情况又会不同?这个是标准吗?
2005-01-31 12:04 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

new constructor[(arguments)];
new 运算符执行下面的任务:
·创建一个没有成员的对象。
·为那个对象调用构造函数,传递一个指针给新创建的对象作为 this 指针。
·然后构造函数根据传递给它的参数初始化该对象。

要注意的是即使当前作用域内没有调用new,但可能在其父作用域里是调用了new的,所以“在new的实例中,this就指实例,否则都指WScript?”,前半句对,而后半句不一定。
2005-01-31 12:16 | birdshome

# re: 原来JScript中的关键字'var'还是有文章的  回复   

btw: Lostinet 推荐的他写的那篇文章很有看头,强烈推荐
2005-01-31 12:17 | birdshome

# re: 原来JScript中的关键字'var'还是有文章的  回复   

如下,怎样在foo中取得foo外面的tmp?


获取全局的 tmp

window.tmp
2005-02-16 18:27 | boynannan

# JavaScript中this关键字使用方法详解[TrackBack]  回复   

Ping Back来自:blog.csdn.net
Dicky引用了该文章,地址: http://blog.csdn.net/applebbs/archive/2005/03/07/313121.aspx
2005-03-07 00:22 | Dicky

# re: 原来JScript中的关键字'var'还是有文章的  回复   

它有局部和整体之分
个人认为还是不忽视为佳
2005-06-06 18:14 | 鬼吧

# re: 原来JScript中的关键字'var'还是有文章的  回复   

<script language="javascript">
var00 = 0;
document.write(var00 + '<br>');

var01 = 1;
function foo()
{
document.write(var01);

}
foo();
</script>
这就就显示
0
1
<script language="javascript">
var00 = 0;
document.write(var00 + '<br>');

var01 = 1;
function foo()
{
document.write(var01);

}
foo();
</script>
这就显示
0
undefined
2005-07-06 16:39 | 孙玉婷

# re: 原来JScript中的关键字'var'还是有文章的  回复   

就如楼主的列子,比如第一个和第三个,我想是不是因为在function中,是不允许定义函数的,比如在第一个列子中,
function foo()
{document.write(var01);
var var01;
}
我觉得,只所以他输出是显示undefined,是因为那个function把输出语句后面的那个
---var ar01 当成了一个变量,而这个变量很明显在前面是没有定义的,所以,他会显示undefined,而第二个之所以会显示正确的数据,就是因为在他的function内,所有的变量都是前面定义过的,他只是拿过来用,当然是没有错的。由此,我估计是不是在function内是不能再定义新的变量的,只能使用原来的???
2005-08-14 00:38 | phornic

# JavaScript中this关键字使用方法详解[TrackBack]  回复   

Ping Back来自:blog.csdn.net
抽烟的猫引用了该文章,地址: http://blog.csdn.net/haluomao/archive/2005/10/12/500954.aspx
2005-10-12 17:24 | 抽烟的猫
#  re: 原来JScript中的关键字'var'还是有文章的   回复   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值