悲催的this悲催的new

今天才发现,原来我对this的理解竟然如此模糊,原来我对new的了解也没有那么多。。
<br />伤心<img src="/images/smiles/icon_cry.gif"/> <img src="/images/smiles/icon_cry.gif"/>
<br />
<br />早晨无意中写了一段代码:
<br /><pre name="code" class="javascript">
function test(){
this.a=100;
console.log(a);
}
try{
new test();
}catch(e){
console.log(e);
}

try{
test();
}catch(e){
console.log(e);
}

try{
new test();
}catch(e){
console.log(e);
}
</pre>
<br />输出:
<br />ReferenceError: a is not defined
<br />100
<br />100
<br />
<br />最开始一直没想通,凭啥第一次new访问不到a,而执行了test函数后就可以访问a了呢?
<br />this.a是给function加属性,不应该影响全局变量啊。
<br />后来把这段代码贴到部门群里面,很快就北京chao君鄙视了。。伤心。。
<br />超君说了几个关键字,new的原理、作用域、全局变量
<br />我还是没有搞懂,我知道是这些东西没弄明白,但是我不知道到底关键再哪里。
<br />chaojun又说 第一次new a没值,第二次给全局a赋值  第三次当然就可以取值了
<br />什么?第二次的a是全局的?
<br />我想了一下,再加上另外两个同事的提醒,突然恍然大悟
<br />function test(){}运行在window域中不就相当于window.test = function(){}么?
<br />顿时恍然大悟,自己竟然连这个最基本的东西都没搞清楚。。
<br />悲哀呀 <img src="/images/smiles/icon_cry.gif"/> <img src="/images/smiles/icon_cry.gif"/>
<br />
<br />其实this到底instanceof谁,得看func被怎么调用,全局域下执行test就相当于
<br />test.call(window)所以this当然指向全局域了。
<br />而new的时候之所以会报错,是因为在new test的时候会用一个临时对象来call test,此时的console.log(a),访问的a是全局的a,因为在tst里面没有申明过a。所以访问不到,而我们执行了test后,通过this.a给a赋值,当然第二次new test的时候就能访问到a了。
<br />
<br />看起来很简单,不过真正要领会到,以我这种智商,还真不知道行不行。。
<br /><img src="/images/smiles/icon_cry.gif"/> <img src="/images/smiles/icon_cry.gif"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值