JAVAScript中的作用域与new,this,var关键字

来源:互联网 发布:手机软件数据备份 编辑:程序博客网 时间:2024/04/25 18:21
最近刚学习JavaScript,从JAVA转过,感觉确实有点不石更啊。。。

贴段代码看看能做对呗:

<script type="text/javascript">var temp1=300;  //windowfunction JSClass(){this.temp1=0;  //TODO 如果改成  ‘temp1=0’  有什么不同内?alert(this.temp1); alert(temp1);}new JSClass; //语句一 JSClass(); //语句二</script>


两次调用,四次弹出框,结果按顺序为:
0,300,0,0

如果TODO 换为 temp1=0的话,四次结果为:
undefined,0,0,0

基础理论我不懂,只按照自己的理解说:
1. 声明变量是否带var关键字:

简单地说,带var的话表示当前作用域的变量(感觉变量和属性还有点区别,window对象里面除外),不带var的话表示声明一个全局变量(属于window对象)。

注意如果在某个自定义对象中声明变量时,这个变量无法被this关键字访问到,this关键字只能访问属性,而并不是变量,并且在作用域外是无法访问的,除非使用闭包。如
function JSClass(){var temp1=0;alert(this.temp1); alert(temp1);}new JSClass; 


结果为undefined, 0

2.this关键字表示当前对象,这个相关文章也很多了,注意的就是“当前对象”到底指向的是谁,如果出现问题的话很有可能是默认的指向window了,需要进行改变。

3.new关键字新建一个对象,并作为当前的操作对象,这时候this关键字指向的就是当前新建的这个对象。


按照上面思路反观最上面的例子:

JSClass可以作为函数,也可以作为对象(具体用语分不大清了,勿喷),外围的window声明了temp1,里面JSClass声明了自己的temp1属性,所以这两个可以完全区分。
new JSClass; //语句一
表示当前对象为JSClass,所以alert(this.temp1)就是0; 而alert(temp1);则是寻找当前作用域的temp1这一变量,结果发现当前作用域没这个变量,于是乎就自动获取外围作用域的temp1,所以输出为300.

JSClass(); //语句二
表示当前对象为Window,注意这时候要先执行一句函数里面的“var temp1=0;”所以alert(this.temp1)就是0,alert(temp1);也是0, 好像对于window来说,声明一个变量就算作window的属性之一了。

尽管上面例子平时不会出现,但是多看看绝对有助于理解这三个关键字,所以平时自己写JS时候尽量不要使用相同的变量或属性名,避免混淆。

总之,new出来的对象会改变当前指向的对象;var是在当前作用域声明一个变量,如果不带var,则表示声明一个全局变量(隶属于window);this是当前对象的操作,会获取对象的属性,而不是变量,函数的调用中,this指向window对象,对当前对象声明一个属性要使用this。
0 0
原创粉丝点击