JavaScript开发中一些问题(二)
JavaScript中如果出现换行,将自动添加;号
<script language="JavaScript" type="text/javascript"> var test = "xxxx yyy"; alert( test );//出现错误 </script>
变量test字符串出现换行这个时候浏览器会自动在换行的xxxx后加;
这样变量test实际为
var test = "xxxx;
yyy";
所以出现错误
html,JavaScript是从上往下依次编译的
即如果加载时执行些JavaScript脚本,脚本中使用的对象必须是在它之前就已经出现的对象。而非在它以后出现的对象
<script language="JavaScript" type="text/javascript"> //在btn加载前使用 alert( document.getElementById( "btn" ).name );//提示缺少对象 </script> <input type="button" name="btn" id= "btn" value="测试" /> <script language="JavaScript" type="text/javascript"> //在btn加载后使用 alert( document.getElementById( "btn" ).name );//正确,弹出结果btn </script>
第一调用btn对象时相应的html控件btn并未解释到,所以出错
第二次调用时在btn解释后,这个时候调用能获取相应的对象
JavaScript是按块解释并执行
同一个块中的调用与声明无前后关系
但是不同的块中调用时,调用的块必须在声明的块后面
<script language="JavaScript" type="text/javascript"> //在testF未声明前调用testF testF();//未出错,弹出 我在声明前调用! function testF(){ alert( '我在声明前调用!' ); } testO();//出错,缺少对象 </script> <script language="JavaScript" type="text/javascript"> function testO(){ alert( '我在中间!' ); } </script> <script language="JavaScript" type="text/javascript"> testO();//我再中间 </script>
testF()在未声明前调用并为出错,因为JavaScript是按块解释并执行,即当解释完整个script块时才执行,所以弹出结果而不是出错。
testO()的声明和调用不在同一个script中,当调用的script块执行时,而testO()方法并为编译,所以出错
而最后的testO(),再解释执行它时testO()的声明所在的script块已完成编译所以没有出错
作用域二
JavaScript中只有函数有作用域,而对于if、for、while、switch等块结构是没有作用域的。
//与Java(c++)中的作用域不同,Java(c++)中以{}为作用域的分界点,
注:对于Java语言来说,有一条限制。在Java语言中,即使作用域不同,其定义的变量名字也不能够相同。
str = "我是全局的!"; function testequa( ){ var str = "您好"; do{ var str = "我在while中!"; }while( false ); alert( str );//输出结果为我在while中! alert( testStr2( ) );//我是全局的! } function testStr2( ){ return str; }
str是个全局变量,因函数有作用域,所以函数testequa再次声明str变量会让全局的str对于函数testequa是不可见(不是覆盖)。
同时因为if、for、while、switch等块结构是没有作用域,do while 中str 会覆盖函数testequa的str变量的值。所以alert( str )输出结果
为"我在while中!"而对于全局的str的值并没有改变所以alert( testStr2( ) )输出的结果为"我是全局的!"
JavaScript路径
文件外部引入javascript时,javascript的当前路径是引入文件的当前路径,而不是javascript文件的所在路径。
判断某个控件是否存在
//by id没有获取到相应的控件对象是为null
if( document.getElementById( "xxxx" ) == null ){
//控件不存在时的操作
}
动态的调用函数
1:使用eval方法 eval是将字符串作为JavaScript代码执行
function testEvel( ){ alert( "动态执行!" ); } eval( "testEvel()" );//弹出结果"动态执行!" eval( new String( "testEvel()" ) );//没有任何返回
注:该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。
推荐不使用该方法 因为使用eval相当于在运行时再次调用解释引擎对内容进行运行,需要消耗大量时间。
2:使用Function创建,这是用在于控件的事件中,如按钮
<input type="button" name="btn" id= "btn" value="测试" /> <script language="JavaScript" type="text/javascript"> function testEvel( ){ alert( "动态执行!" ); } //对象事件绑定函数 document.getElementById( "btn" ).οnclick=new Function(" testEvel( )");
</script>
3:使用形参的方式传递,详细的实例见JavaScript开发中一些问题(一)
下班,下次再写