关于JS变量作用域的问题

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<script type="text/javascript">
var v1, v2;

v1=10;
v2=20;

function a(){
var v2, v3;
alert("v1= "+v1+"\r\nv2 ="+v2+"\r\nv3 = "+v3);
v2=v3=40;

function b(v3, v4){
alert("v3="+v3+"\r\nv4="+v4);
v2=v3=80;
}

b(v3);
alert("v2="+v2+"\r\nv3="+v3);
alert(v4);
}
a();
</script>
</head>
<body style="overflow: auto;">

</body>
</html>

为什么在最后显示的提示框里v2=80,而v3却=40呢?

v2=80,v3=40

1、这个v2和v3,都是a里面定义的局部变量:
function a(){
var v2, v3;

2、v2=80,是调用b函数时,b函数直接对b外部的v2进行了赋值,最近的是a函数的v2,所以最终alert的v2是80

3、b函数虽然对v3赋值为80,但是v3是参数里的v3,并不是a函数的v3,对参数v3进行赋值,不会改变a函数的v3,所以alert的v3不变,还是40

另外,楼上的回答虽然有一定道理,但是只是针对同一个人写同一个项目而言,
实际的工作开发中,引用多个其它人开发的js,甚至其它公司开发的js都是常事,所以出现上面的类似代码也是可能的,另外,这个例子对于理解js的变量作用域还是有一定意义的
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-11
一个逻辑混乱不符规范的js脚本,实在无讨论的必要。
我不奢望你采纳,也不想要你那点毫无意义的分值,也不想在这里长篇大论帮你解释这个问题。
不知道你为什么要在函数内部定义和全局变量相同的变量名?????这可是大忌,同时也很没必要。
不过有一点是肯定的:不要在函数内部定义和全局变量一样的变量名,未经定义的变量不要使用。要不有故弄玄虚之嫌。
你既然知道周围有一个叫张三的人,为什么还要把你的孩子取名叫张三?这不是没事找抽型的嘛。这种问题完全没有花时间讨论和解决的必要。
程序的宗旨不是高深莫测没事找事,而是帮助人们解决问题,把复杂的问题简单化,帮助人们减轻工作和生活负担。追问

本人是新手,是书本内容来的,就是不懂才放上去问的,望指教

追答

如果这个例子在书本里作为反面例子,那无可厚非;如果这个例子作为正面例子让你去理解和阅读,那我老实告诉你,这种书还是早点放下,以免影响你后面学习程序的思维。
这种例子有点故弄玄虚,浪费人的时间。
function a(){
var v2, v3;
alert("v1= "+v1+"\r\nv2 ="+v2+"\r\nv3 = "+v3);
v2=v3=40;
}
正规的编辑器都会告诉你,v2重复定义,将出现不可预知的结果。

菜鸟求助:js中作用域的问题
变量的作用域通过作用域链来管理,类似于原型链。作用域链是一层一层往上查找的机制。内部作用域(如函数内定义的变量)优先级高于外部作用域。例如,当你在函数中声明一个变量s,其值为10,当你调用alert(s)时,会输出10,因为在这个作用域中已经存在了一个s,所以不会去查找外部作用域。当函数中...

js关于作用域的问题
首先说一下js全局变量的作用域:在js中如果直接定义一个变量,都是在window这个作用域下定义的 比如 var num = 60 也可以写成这样 window.num = 60 这两个写法是完全一样的,不管哪种写法,使用 console.log(num, window.num) 都可以打印出来 num的值 相对于题主的这个例子:函数内部声明一个局...

js变量修改了但是拿到的还是没改前的
1. 变量作用域问题:变量的作用域会影响变量的访问。如果变量被定义在函数内部,那么在函数外部就无法访问该变量,也就无法拿到该变量的值。此时,可以将变量定义在全局作用域中,从而保证变量的可访问性。2. 变量赋值问题:如果变量被重新赋值,但是拿到的却是原始值,可能是因为赋值的方式不正确。在 Ja...

有关javascript的全局变量的问题,请问下面第一个输出s为什么结果是undefi...
js里面,函数作为作用域范围,在这个范围里,首先完成的过程是变量初始化和声明。也就是说,show1执行之前,内部变量已经初始化,初始化的值都是undefined。所以,第一write的s等于undefined。js的运行顺序 步骤1. 读入第一个代码段(js执行引擎并非一行一行地执行程序,而是一段一段地分析执行的)步骤2....

js的私有变量和作用域链的练习题求解答
首先 ,a[0]=100;这个时候的a是全局变量的a,当 a=[100]时,重新赋值了,a就是函数内的私有变量了,不是外面的全局变量了,所以 整个函数对全局变量a的操作只有 a[0]=100;所以最终结果是 100,34 传到函数内部的是一个引用对象,又不希望改变全局变量的值,就要重新赋予空间并且赋值 ...

浅析Js中const,let,var的区别及作用域
理解:let变量的作用域只能在当前函数中 早期的JavaScript中,声明变量只能使用var关键字定义变量,并没有定义常量的功能。通过var关键字定义的变量,其作用域只能函数级或是全局作用域,并没有块级作用域。ES6(ECMAScript 2015)对这一问题做了改善,增加了用于定义块级变量的let关键字和用于定义常量的...

如何更好的理解javascript变量类型以及变量作用域
变量作用域 任何程序语言中变量的作用域都是一个很关键的细节。JS中变量的作用域相对与JAVA、C这类语言显得更自由,一个很大的特征就是JS变量没有块级作用域,函数中的变量在整个函数都中有效,运行下面代码: <SCRIPT LANGUAGE="JavaScript" type="text\/javascript"> \/\/定义一个输出函数 function outP...

js立即执行函数,作用域问题
js分为全局作用域和函数作用域,全局作用域在函数内部可以访问到,但是函数内部的变量,外部无法访问到 var name = 'zhangsan';(function(){ console.log(name)\/\/这里因为变量提升,name === undefined,所以结果是undefined var name = 'lisi'console.log(name)\/\/这里执行的是 name = lisi ,所以自然...

Js基础27:作用域
函数和变量的有效范围就是作用域 1、作用域的概念 这是因为js中存在作用域的概念。作用域:作用域就是指定一个变量或者一个函数的作用范围。能在页面的任何位置都可以访问,称为 全局作用域 只能在局部(函数内)访问,称为为 局部作用域 上述代码中,a是全局变量,b是局部变量 ES5中只有函数才有...

前端:如何理解 JS 的作用域和作用域链?说说闭包的两个应用场景_百度知 ...
全局作用域就是最外层的作用域 ,如果我们写了很多行 JS 代码,变量定义都没有用函数包括,那么它们就全部都在全局作用域中。这样的坏处就是很容易撞车、冲突。这就是为何 jQuery、Zepto 等库的源码,所有的代码都会放在 (function(){...})() 中。因为放在里面的所有变量,都 不会被外泄和暴露 ,...

相似回答