作者mrbigmouth (大嘴先生)
看板Ajax
标题Re: [问题] 有办法印出this的内容吗?
时间Tue May 10 11:47:32 2016
: 想在问各位 在xul内 <window onload="new Temp()">
: 接着
: function Temp() {
: myFunc.call(this);
: }
: 这样在myFunc里面的this...就会是一个空物件@@?
对
: ※ 编辑: aa06697 (111.255.236.81), 05/08/2016 16:21:52
:
: 还有...关於所谓的「空物件」 到底是指什麽呀?
: http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript
: 他中间有给一段example 在obj1 = new ObjMaker();
: 他是说A new, empty object was created called obj1
: 所以一开始创建出来的那个空物件 其实是 obj1 = {} ?
: 那直接new ObjMaker() 出来的空物件 又是什麽囧
: ※ 编辑: aa06697 (111.255.236.81), 05/08/2016 16:39:35
你一直搞混了整件事的先後顺序,
首先,「在几乎所有语言中」,
等号指定式,也就是'xxx = ooo;'这种语法在执行时,
一定是ooo先执行完毕,才会执行等号,将结果回传给等号前的变数。
比如a = 1 + 1,先执行1+1,才会把2这个结果丢给a,这很好理解吧?
另外JavaScript有一个特性叫hoisting,
它会自动把程式内所有的宣告变数动作提升到整个scope的最前面,
因此
var obj1 = new ObjMaker();
在执行时会自动变成
var obj1;
obj1 = new ObjMaker();
这里的执行先後顺序可以分解如下
var obj1; //自动指派undefined给obj1
new ObjMaker(); //执行ObjMaker并取得回传值
obj1 = //将new ObjMaker()的回传值指派给obj1
接下来是new关键字的机制,
javascript的this会随着当前scope的执行环境而变动,
当你使用new关键字在function执行之前时,
系统会自动生成一个空物件,也就是一个{},
然後将该空物件指派给该function的this。
你应该要知道的是,在该function刚开始执行的时候,
唯一能指向该空物件的只有该function内的this变数,
此时obj1 = new ObjMaker()的=还没被执行到,因此obj1只可能是undefined。
当该function的执行完毕之後,
系统会检查该function的回传值(return),
如果该return值并非物件型态(阵列、function都算是物件的一种),
就会将当初自动生成的空物件(这时候很可能已经不空了)当作回传值。
也就是说,你看到的一般建构式最後面其实都省略了return this这行程式。
好,最後,假设一切都没有意外,那个空物件{}最终被指派给了obj1,
那麽没错,「在一切执行完毕之後」,
obj1会等於ObjMaker被执行时所产生出来的空物件this。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 211.75.132.13
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Ajax/M.1462852054.A.74F.html
※ 编辑: mrbigmouth (211.75.132.13), 05/10/2016 11:51:29
※ 编辑: mrbigmouth (211.75.132.13), 05/10/2016 11:51:51
1F:推 weiclin: 推详细解说 05/10 12:16
2F:推 aa06697: 感恩感恩 05/11 00:21
3F:推 pttnews: 大师大恩~感恩感恩 05/11 13:22