日期:2014-05-16  浏览次数:20344 次

javascript中作用域,优先级等等问题, 求助中。。。。。。。。。。。。。。。
HTML code
 <html> 

<head>
    <title>Untitled Page </title>
</head>
<body>

<!--脚本块1-->
<script>


alert(a);//undefined            第一个A

var a="dd";
alert(a);//dd                  第二个A
</script>

<!--//脚本块2-->
<script>


alert(a);//function a(){}              第三个A

var a=function a(){};

alert(a);//function a(){}                  第四个A


</script>

<!--脚本块3-->
<script>


alert(a);//function a(){}                      第五个A

var a=function(){};

alert(a);//function(){}                      第六个A
</script>


<script>
/*******************************************************
关于以上的不解点。
在上述中我只用了一个a,
弹出的结果写在了注释后面


问题1:

*********

为什么第三个A不是弹出[dd],而第五个A弹出[function a(){}],也就是说,
第三个没有延续  [脚本块1],而第五个就延续  [脚本块2]


**********


问题2:
***********
它的执行顺序是怎样的。。
每个脚本块它们为什么不同。。
***********


问题3
***************
当我将它们合为一个脚本块里。为什么结果变了呢?

// <script>


alert(a);//function a(){}            第一个A

var a="dd";

alert(a);//dd                          第二个A


                 
alert(a);//dd                          第三个A

var a=function a(){};

alert(a);//function a(){}                  第四个A


alert(a);//function a(){}                      第五个A

var a=function(){};

alert(a);//function(){}                      第六个A


<!-- </script>-->

注意其中,第一个A变了,还有第三个A也变了。

与分成各个脚本块有什么不同吗??


***************


  问题4
***************
额外的一个问题:

当我这样定义了一个脚本时。

var bi=function(){


  this.aa=1;
  this.aa=2;
 

}

bi.prototype.aa=3;

var bi=new bi();
alert(bi.aa); //2  ---->弹出是2

问题是。为什么原型属性a没有去覆盖i内部的aa属性呢。
而aa内部的属性可以被覆盖


就是说。为什么弹出的结果不是3呢??
有可能得到3吗?

***************

********************************************************/
</script>
</body> </html>


------解决方案--------------------
学习学习。。。。 好贴啊。。。
------解决方案--------------------
我可以回答第四个问题:
首先js的构造函数定义方法合理的应该属性放入内部,方法定义在外部,而你要改变属性就可以通过参数传递,
进行初始化,注意别定义和函数一样的对象名,所以按照这种格式,我们通过原型方法就可以改变重载函数的方法。
JScript code

var bi=function(i){
this.aa=i;
}
bi.prototype.bb=function(){return(this.aa)};
//bi.prototype.bb=function(){return("aaaaaa")};
var c