标签:
首先声明,我是小白,以下只是自己的简单理解。
先看下面的代码:
1 (function () { 2 3 console.log(this); 4 5 })();
毫无疑虑,输出的是window。
在看下面代码:
1 (function () { 2 3 function Main() { 4 console.log(this); 5 } 6 new Main(); 7 })();
当然这样返回的是Main{}。
解释一下吧:首先说this返回的是当前对象,而在次代码中,this也就指的是,Main的这个对象了。(注意是对象)。
接着看下面的代码:
1 (function () { 2 3 function main() { 4 console.log(this); 5 } 6 main(); 7 })();
这个结果输出的是window,是不是有点不可思议。接下来分析一下,懂原理了就明白了O(∩_∩)O哈!
先提下new,它声明了一个对象,这个对象再去执行一个函数。拿第二个代码来说,new声明了一个对象Main{},它去执行的函数,所以这个this返回的是Main{}对象。
如果没有new,而直接执行函数main,那么谁去执行的呢,不用说,没有对象了,这个负担就交给了window了(window:我心累啊!)
最后提一点,第二个和第三个代码,函数名不一样,第二个代码是Main(),第一个字母是大写的,也就表明了它是构造函数。这里说的目的是,webstorm编译器会给予警告,不会报错,但看起来不爽,而且编码也不规范(对于我这强迫症患者更是痛苦啊O(≧口≦)O)
1 (function () { 2 3 var self=this; 4 function Main() { 5 console.log(self); 6 } 7 new Main(); 8 })();
这次输出的是window,这就表明this可以传递。
用处:当你想获取函数外部的函数的this时候可以先用一个对象变量保存this,从而传递this。(这算是一个技巧吧)
接着"上菜"
1 (function () { 2 3 function Main() { 4 var show = this.showThis; 5 show.apply(this); 6 } 7 8 Main.prototype.showThis = function () { 9 console.log(this); 10 }; 11 new Main(); 12 })();
结果是Main{},这段代码用了原型方法,当然this也指的是Main{}这个对象。
prototype明天如果有时间话整理(明天又要开始培训了苦逼啊)
标签:
原文地址:http://www.cnblogs.com/chenluomenggongzi/p/5793759.html