是否要来点官方的解释?(微软JScript参考)JScript 在运行代码前处理变量声明,所以声明是位于一个条件块中还是其他某些结构中无关紧要。JScript 找到所有的变量后立即运行函数中的代码。如果变量是在函数中显式声明的 — 也就是说,如果它出现于赋值表达式的左边但没有用 var 声明 — 那么将把它创建为全局变量。
楼上的说的是错误的, 下面的代码就没有把a输出来, <script> function f(){ a =1;
} b = 2; alert(a); alert(b); </script>
等待高手来解析var与没有var的区别?
可以参考这个: The var statement is used to declare a variable, and outside of a function its use is optional. While a variable can be declared simply by assigning it a value, it is good practice to use var as there are two cases in functions where it is necessary: If a global variable of the same name exists. If recursive or multiple functions use variables of the same name.
呵呵,有点意思^_^我想加一点: 其实JS与C和C++在变量作用域上有很大不同。JS中,函数内声明的变量,无论是在什么地方声明的,它都会影响整个函数,甚至影响同名的全局变量。下面代码很直观说明了: a='111'; function f() { alert(a); var a="222"; alert(a); } f();
to brothercat(水星上疯狂上网的猫 ^_^) 你举的这个例子不对,第一个显示undefined是因为你后面声明了a,所以开始的时候他认为局部变量a还没有,所以显示undefined,你把你的例子改成a='111'; function f() { alert(window.a); var a="222"; alert(a); } f(); alert(a);就知道区别了
to wideroad() :哈哈趁帖子还热,跟到发个问题: 个人理解计算机查找变量,先是在当前作用域查找,如果没有找到则返回到他上一层查找直到查到顶层。a='111'; function f() { alert(window.a); //问题是:在这个地方a是否存在呢?这个时候函数f中不存在他应该返回查找才对啊。而f的顶层应该是window。所以这里的 window.a 为什么不等于 (global.a)呢。唯一的理由就是,window并不是所谓的全局。但是这样也说不通。就算还有高于window层次的作用域,这里的a也应该等于window.a才对,因为window应该就是f内作用域的父作用域吧。搞糊涂了。。 var a="222"; alert(a); } f(); alert(a);
wideroad() 你这样理解也可以,但解析过程并不是你想的那样a='111'; function f() { alert(a); } f(); 你说结果是什么呢?你写的程序没有问题,但那还是作用域的问题。我的意思很简单:局部变量会影响整个函数,甚至影响到同名全局变量在函数中的执行情况。我写的实际上等同于: a='111'; function f() { var a; alert(a); a="222"; alert(a); } f();在JS解析器中,变量是先声明在赋值的过程。
至于你写的这一段a='111'; function f() { alert(a); } f();因为函数里没有同名的变量,所以直接指向全局变量a
最好养成声明的习惯。 假设下面的代码:function GetNodeValue(TREENODES) { var treeNode=TREENODES.getChildren(); var Node; var nodeLength=treeNode.length; var i; for(i=0;i<nodeLength;i++) { var nodetext=treeNode[i].getAttribute("TEXT"); alert("GetNodeValue:"+nodetext); GetNodeValue(treeNode[i]); }}假设没有那句 var i; ,递归调用将会失效,for循环里面i的值将一直为0。
还是没有弄明白, 改天把JavaScript好好研究研究,再来看这个问题, 先收藏了,
===========情况1================================================= <script language="javascript"> z=1;//全局变量 function aa() { alert(z); z=2; //z为函数里,没有用var声明的全局变量 alert(z); } bb(); alert(z)//结果为2 </script> =========================================== ==================情况2==================== <script language="javascript"> z=1;//全局变量 function bb() { var z alert(z);//结果为undefined z=2; //z为函数里,用var声明的局部变量 alert(z);//结果为2 } bb(); alert(z)//结果为1 </script>================情况3==================== <script language="javascript"> z=1;//全局变量 function cc() { var z alert(window.z);//结果为1.用到对象的方法去考虑! z=2; //z为函数里,用var声明的局部变量 alert(z);//结果为2 } cc(); alert(z)//结果为1 </script>
function av(){
var a,b;
alert(a);
alert(b);
}
function av2(){
var b;
alert(a);
alert(b);
}
</script><input type=button value=click onclick="av()">
<input type=button value=click onclick="av2()">
在函数里用了var 就是局部
下面的代码就没有把a输出来,
<script>
function f(){
a =1;
}
b = 2;
alert(a);
alert(b);
</script>
The var statement is used to declare a variable, and outside of a function its use is optional. While a variable can be declared simply by assigning it a value, it is good practice to use var as there are two cases in functions where it is necessary: If a global variable of the same name exists. If recursive or multiple functions use variables of the same name.
而且,申明的时候引擎还会遍历堆栈查找是否存在该变量(局部,with块,全局.....)。性能上也会打折扣!!
下面的代码就没有把a输出来,
<script>
function f(){
a =1;
}
b = 2;
alert(a);
alert(b);
</script>
---------------------------------------------------------
f()没有执行 ,当然alert不出来了
直接使用变两表明为全局的。使用了var关键字的表示只在本作用域内有效
其实JS与C和C++在变量作用域上有很大不同。JS中,函数内声明的变量,无论是在什么地方声明的,它都会影响整个函数,甚至影响同名的全局变量。下面代码很直观说明了:
a='111';
function f()
{
alert(a);
var a="222";
alert(a);
}
f();
function f()
{
alert(window.a);
var a="222";
alert(a);
}
f();
alert(a);就知道区别了
个人理解计算机查找变量,先是在当前作用域查找,如果没有找到则返回到他上一层查找直到查到顶层。a='111';
function f()
{
alert(window.a);
//问题是:在这个地方a是否存在呢?这个时候函数f中不存在他应该返回查找才对啊。而f的顶层应该是window。所以这里的 window.a 为什么不等于 (global.a)呢。唯一的理由就是,window并不是所谓的全局。但是这样也说不通。就算还有高于window层次的作用域,这里的a也应该等于window.a才对,因为window应该就是f内作用域的父作用域吧。搞糊涂了。。
var a="222";
alert(a);
}
f();
alert(a);
function f()
{
alert(a);
}
f();
你说结果是什么呢?你写的程序没有问题,但那还是作用域的问题。我的意思很简单:局部变量会影响整个函数,甚至影响到同名全局变量在函数中的执行情况。我写的实际上等同于:
a='111';
function f()
{
var a;
alert(a);
a="222";
alert(a);
}
f();在JS解析器中,变量是先声明在赋值的过程。
function f()
{
alert(a);
}
f();因为函数里没有同名的变量,所以直接指向全局变量a
=============================================================================嗯,shaolinquan()说的和我前面说的:
在JS解析器中,变量是先声明再赋值的过程。表达的是一样的^_^
for(i=0;i<10;i++)
结果就在它自动生成的脚本中产生一个脚本错误,后来加了个var就好了
原来是这里的i影响了生成的那段代码啊
而且那些生成的代码中的for都没有var的学习啊
假设下面的代码:function GetNodeValue(TREENODES)
{
var treeNode=TREENODES.getChildren();
var Node;
var nodeLength=treeNode.length;
var i;
for(i=0;i<nodeLength;i++)
{
var nodetext=treeNode[i].getAttribute("TEXT");
alert("GetNodeValue:"+nodetext);
GetNodeValue(treeNode[i]);
}}假设没有那句 var i; ,递归调用将会失效,for循环里面i的值将一直为0。
改天把JavaScript好好研究研究,再来看这个问题,
先收藏了,
<script language="javascript">
z=1;//全局变量
function aa()
{
alert(z);
z=2; //z为函数里,没有用var声明的全局变量
alert(z);
}
bb();
alert(z)//结果为2
</script>
===========================================
==================情况2====================
<script language="javascript">
z=1;//全局变量
function bb()
{
var z
alert(z);//结果为undefined
z=2; //z为函数里,用var声明的局部变量
alert(z);//结果为2
}
bb();
alert(z)//结果为1
</script>================情况3====================
<script language="javascript">
z=1;//全局变量
function cc()
{
var z
alert(window.z);//结果为1.用到对象的方法去考虑!
z=2; //z为函数里,用var声明的局部变量
alert(z);//结果为2
}
cc();
alert(z)//结果为1
</script>