1、Javascript引擎首先会扫描所有的变量声明,然后将这些变量的声明移动到最顶部。所以:
<script type="text/javascript">
alert("a" in window);//true
var a = 1;
</script>
2、所有函数的声明都在代码执行之前已经完成了声明:所以
<script type="text/javascript">
alert(add(1,2)); //3
function add(x,y){
return x+y;
}
</script>
3、函数声明会覆盖变量声明,但是不是覆盖变量赋值。
<script type="text/javascript">
function add(x,y){
return x+y;
}
var add;
alert(typeof add); //function
</script>
所以上面的例子打印function.
但是如果你给变量赋值了,这个时候就完全相反了。
<script type="text/javascript">
function add(x,y){
return x+y;
}
var add = 1;
alert(typeof add); //number
</script>
来自汤姆大叔的5个题目
1、找出数字数组中的最大元素(使用Math.max函数)
<script type="text/javascript">
var array = [1,2,3,4,10,2,5];
alert(Math.max.apply(this,array));
</script>
2、转化一个数字数组为function数组,每个数组弹出相应的数字。
<script type="text/javascript">
var array = [1,2,3,4,10,2,5],
maxLen = array.length,
result = [];
var i = 0;
for(;i<maxLen-1;i++) {
result[i] = function(){
return array[i];
}
}
alert(result[0]());
</script>
首先分析下上面这种方式为什么不行,且不管下标何如,都打印5,且for循环中最大值为maxLen-2,而不是maxLen-1。
分析:因为函数的调用只有在其执行的时候才会去真正去调用它内部的语句,这个时候的for循环已经执行完全,i=maxLen-1,所以每次调用的时候其实都是返回array[maxLen-1]的值,所以返回的是5,如果for循环的最大值为maxLen-1,这时候for循环执行完毕,i=maxLen了,此时再打印result[0](),肯定打印的是"undefined"。
解决方法:利用闭包解决,什么是闭包?
<script type="text/javascript">
var array = [1,2,3,4,10,2,5],
maxLen = array.length,
result = [];
var i = 0;
for(;i<maxLen;i++) {
(function(index){
result[index] = function(){
return array[index];
}
})(i);
}
alert(result[5]());
</script>