java实不是一般人弄得懂,太诡异

newlive001 2010-01-26 01:43:16
js用浅的上手快,用深入没过十年八年内功真的不行,丝毫不差于c++和汇编语言, 有很多莫名的诡异不认真测试还真想不到,看下面代码

<SCRIPT LANGUAGE="JavaScript">
a();
function a(){
var x=1;
function b(){
document.writeln(x);
var x=2;
document.writeln(x);
}
b();

}
</SCRIPT>

变量x到底是定义还是没定义,到底能不能访问,不是由前面说了算,而是后面说了算,上面输入结果为:undefined 2 也就是说第一个x没找到,那么再改一下


<SCRIPT LANGUAGE="JavaScript">
a();
function a(){
var x=1;
function b(){
document.writeln(x);

document.writeln(x);
}
b();

}
</SCRIPT>

现在输出2 2 也就是两次检查x都找到了,天啊 ,到底认不认识x变量得后面的脸色
...全文
141 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjh811 2010-01-26
  • 打赏
  • 举报
回复
lz连java是什么不知。。。
草根醉秋意 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ahywg 的回复:]
1.js在页面加载过程中顺序执行。但是分块预编译、执行。
2.JS 在执行前会进行类似"预编译"的操作,而且先预声明变量再预定义函数。
此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了"var a"没有赋值,即在预编译结束时a 为undefined。
3.(注意)并不是先全文编译完在执行,而是块编译,即一个script块中,预编译再执行,然后(按顺序)下一个script块,预编译再执行,但此时上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的。
4.变量没声明就引用,会报错,但对象方法,对象变量没声明,是undefined
5.在函数中变量不声明就赋值,会被认为是全局变量,用var声明后为函数变量
6.在执行函数时时也是先编译后执行,但要注意函数定义中(即大括号中)的代码即使有错只要函数不执行,就不会有影响,但一执行函数,开始函数预编译就会出错。
[/Quote]
预编译时确定变量x的作用域在函数内,逐行解析时第一次输出变量在函数内未给变量赋值,所以其值是undefined。
msokid 2010-01-26
  • 打赏
  • 举报
回复
<SCRIPT LANGUAGE="JavaScript">
a();
function a(){
var x=1;
function b(){
document.writeln(x);
var x=2;
document.writeln(x);
}
b();

}
</SCRIPT>

因为a()里面有两个x 的定义,所以第一个指令被摈弃了,等于没有
你修改了之后,只有一个定义式了,所以就都可以被检查到了

你可以修改成

<SCRIPT LANGUAGE="JavaScript">
a();
function a(){
var x=1;
function b(){
document.writeln(x);
x=2;
document.writeln(x);
}
b();

}
</SCRIPT>
Jat_MeiBo 2010-01-26
  • 打赏
  • 举报
回复
lz,你说你第二次运行的时候2次输出都是2?你明明x=1;怎么可能打印出2来呢?你是不是什么地方代码写错咯,
newlive001 2010-01-26
  • 打赏
  • 举报
回复
其它语言会输出 1 2 第一个会输出全局的x =1 当局部又定义相同名的变量时,优先取局部变量,绝大数高级语言就这样做的,js想别出新裁也要符合一下人的起码常识,怎么猜都猜出来结果是出乎意料的,如果不亲自执行的话,如下面几个语文看起差不多,但执行的结果是完全不相同的
<SCRIPT LANGUAGE="JavaScript">
document.writeln(a);
var a=0;
</SCRIPT>
执行结果undefine
<SCRIPT LANGUAGE="JavaScript">
document.writeln(a);
a=0;
</SCRIPT>
执行报错
<SCRIPT LANGUAGE="JavaScript">
var a=0;
document.writeln(a);
</SCRIPT>
输出0
看你疯不疯
一弗楚 2010-01-26
  • 打赏
  • 举报
回复
1.js在页面加载过程中顺序执行。但是分块预编译、执行。
2.JS 在执行前会进行类似"预编译"的操作,而且先预声明变量再预定义函数。
此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了"var a"没有赋值,即在预编译结束时a 为undefined。
3.(注意)并不是先全文编译完在执行,而是块编译,即一个script块中,预编译再执行,然后(按顺序)下一个script块,预编译再执行,但此时上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的。
4.变量没声明就引用,会报错,但对象方法,对象变量没声明,是undefined
5.在函数中变量不声明就赋值,会被认为是全局变量,用var声明后为函数变量
6.在执行函数时时也是先编译后执行,但要注意函数定义中(即大括号中)的代码即使有错只要函数不执行,就不会有影响,但一执行函数,开始函数预编译就会出错。
KK3K2005 2010-01-26
  • 打赏
  • 举报
回复
var x=1;
function b(){
document.writeln(x);
var x=2;
document.writeln(x);
}
b();


其他编程语言你按这个逻辑写看看什么结果

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧