js里面,函数作为作用域范围,在这个范围里,首先完成的过程是变量初始化和声明。也就是说,show1执行之前,内部变量已经初始化,初始化的值都是undefined。所以,第一write的s等于undefined。
js的运行顺序
步骤1. 读入第一个代码段(js执行引擎并非一行一行地执行程序,而是一段一段地分析执行的)
步骤2. 做语法分析,有错则报语法错误(比如括号不匹配等),并结束
步骤3. 对var变量和function定义做“预解析”(永远不会报错的,因为只解析正确的声明)
步骤4. 执行代码段,有错则报错(比如变量未定义)
你的例子中,一个function可以看成一个独立的作用域空间,是一个独立的代码片段,执行是,第一步是变量预解析,所以,不管s在全局变量是否存在,你那个function内部执行的时候,局部变量s已经声明,初始化了,在函数执行执行,变量会提前声明的,预解析阶段,所有变量都是undefined。你的代码实际效果是这样的:
var s;
s="1";
function show1() {
var s;
document.write(s+"
");
s="3";
document.write(s+"
");
}
show1();
如果这样写,就很清楚了吧,js就是这样分析代码的。
综合了一下各位朋友的答案,终于取到了值。m,mm是两个全局变量。
虽然他们是全局变量,但是必须经过一次转换(赋值)才能传到另外一个函数。
有需要的朋友一定要认真看图,有注释的。
s是在外边定义了一次,但是在调用show1()时,先会对变量(方法)等进行一次检查。如果该内存块内有与全局变量同名的变量。全局变量失效,会调用show1()函数内的局部变量;
而在show1()中,s是先调用 后声明的。所以浏览器认为是未声明的
上面几位说的都不对,呵呵。第一个s是undefined, 和局部变量、全局变量没有任何关系,而是和document.write(...)这个方法有关。可以很简单的举例证明:
把document.write(...)改成alert(...)。你会发现,两次弹出的信息都是有值的。
一旦调用document.write,会直接清除掉原来页面的内容,打开一个新文档写入内容,以至于原来页面中定义的变量啊、标签啊等,通通都没有了。(所以我们有时候会发现 document.getElementById('xxx')突然就返回null了)。
满意请采纳。
这个只能说javascript不像java这样的编译型的编程语言一样能自动识别变量的作用域.
javascript不能用函数里的变量来覆盖全局变量
如果一定要这么写的话那就改成