JavaScript编程规范和应用
(一)准确分析JavaScript执行顺序
alert(a); //undefined
var a = 1;
alert(a); //1
因为变量声明实在预编译期进行的,所以,在执行期间,变量对全部代码来讲都是可见的,执行上面的代码,提示的值是undefined,而不是1,这是由于变量初始化过程发生在执行期而不是预编译期。在执行期,JavaScript解释器是按着代码前后顺序进行解析的,若是在前面代码行中没有为变量赋值,那么JavaScript解释器就会使用默认值undefined,因为在第二行中为变量a赋值了,所以在第三行代码中会提示变量的值为1而不是undefined。
同理,在下面实例中,在函数声明前调用函数也是合法的,并可以被正确解析,所以,返回值为1
f(); //1
function f(){
alert(1);
}
可是,若是按照下面方式定义函数,那么JavaScript解释器会提示语法错误
f(); //undefined
var f = function(){
alert(1);
}
在上面的代码中定义的函数仅做为值复制给变量f,所以,在预编译期,JavaScript解释器只能为声明变量f进行处理,而对于变量f的值,只能等到执行期按顺序进行赋值,天然就会提示语法错误,提示找不到对象f。
因为JavaScript是按块执行的,所以在一个JavaScript块中调用后面块中变量或函数就会提示语法错误,例如,在JavaScript解释器中执行下面代码时就会提示语法错误,显示变量a未定义,对象f找不到。
<script type="text/javascript">
alert(a);
f();
</script>
<script type="text/javascript">
var a = 1;
function f(){
alert(1);
}
</script>
虽然JavaScript是按块执行的,可是不一样块都属于同一个全局做用域,也就是说,块之间的变量和函数是能够共享的。因为JavaScript是按块处理代码,同时又遵循html文档流的解析顺序,所以在上面示例中会看到语法错误,可是在文档流加载完毕后再次访问就不会出现这样的错误,例如,把访问第2个代码块中的变量和函数的代码放在页面初始化事件函数中,这样就不会出现语法错误了。
<script type="text/javascript">
window.onload = function(){
alert(a);
f();
}
</script>
<script type="text/javascript">
var a = 1;
function f(){
alert(1);
}
</script>
若是一个页面中存在多个window.onload事件处理函数,那么只有最后一个才是有效的,为了解决这个问题,能够吧全部脚本或者调用函数都放在同一个onload事件处理函数中
(二)关于document.write
document.write('<script type="text/javascript">');
document.write('f();');
document.write('function f(){');
document.write('alert(1);');
document.write('}');
document.write('<\/script> ');
使用document.write()方法输出的JavaScript脚本字符串必须放在同时输出的<script>标签中,不然JavaScript解释器会由于不能识别这些合法的JavaScript代码而做为普通的字符串显示在页面文档中,例如,下面的代码就会把JavaScript代码显示出来,而不是执行它:
document.write('f();');
document.write('function f(){');
document.write('alert(1);');
document.write('}');
经过document.write()方法输出并执行脚本也存在必定的风险,由于不一样的JavaScript引擎对其执行顺序不一样,同时不一样浏览器在解析是也会出现bug
(1)找不到经过document.write()方法导入的外部JavaScript文件中声明的变量或函数,例如:
document.write(' <script type="text/javascript" src ="test.js"><\/script>');
document.write('<script type="text/javascript">');
document.write('alert(n);');
document.write('<\/script> ');
alert(n+1);
分别在不一样浏览器中测试,均会发现提示语法错误,找不到变量n,也就是说,若是在JavaScript代码块中访问本代码块使用document.write()方法输出的脚本导入的外部JavaScript文件所包含的变量,会显示错误,同时,若是在IE中,不只在脚本中,在输出的脚本中也会提示找不到输出的导入外部JavaScript文件的变量
(2)不一样JavaScript引擎对输入的外部导入脚本的执行书序略有不一样,例如:
<script type="text/javascript">
document.write(' <script type="text/javascript" src ="test.js"><\/script>');
document.write('<script type="text/javascript">');
document.write('alert(2);');
document.write('alert(n+2);');
document.write('<\/script> ');
</script>
<script type="text/javascript">
alert(n+4);
</script>
上面这段代码在高级浏览器中执行时分别会弹出:1,2,3,5,可是在IE中会弹出:2,错误,1,5
能够把凡是输出脚本导入的外部文件,都放在独立的代码块中,这样根据上面介绍的JavaScript代码块执行顺序,就能够解决不一样浏览器的不一样执行顺序的问题,以及可能存在的bug,例如:
<script type="text/javascript">
document.write(' <script type="text/javascript" src ="test.js"><\/script>');
</script>
<script type="text/javascript">
document.write('<script type="text/javascript">');
document.write('alert(2);');
document.write('alert(n+2);');
document.write('<\/script> ');
</script>
<script type="text/javascript">
alert(n+4);
</script>
这样,在不一样的浏览器中都可以保证按顺序执行上面的代码
(三)减一使用直接量
在JavaScript中有多种方法建立对象和数组,可是没有什么比建立对象和数组直接量更快的。例如:
var obj = {
name : "sunshine",
age: 32
}
var arr = ['name','age'];
javascript