写这篇文章以前是看了这篇文章讲关于箭头函数中this指向的问题,因而借此把相关的函数,构造函数,new,this,箭头函数的一些概念结合本身的理解又理了一遍,想着好好复习一下,最后有了写这篇文章的想法。我不太喜欢说一些太专业的话(本身菜,无法专业),因此都是本身理解以及本身总结最后得出的结论,首先看下下面这四个控制台的输出结果:es6
1. var a = 11 function test () { this.a = 22 let b = function () { consolve.log(this.a) } b() } var x = new test() => 11 x.a => 22 2. var a = 11 function test () { this.a = 22 let b = function () { consolve.log(this.a) } b() } var x = test() => 22 x.a => Uncaught TypeError: Cannot read property 'a' of undefined 3. var a = 11 function test () { this.a = 22 let b = () => { consolve.log(this.a) } b() } var x = new test() => 22 x.a => 22 4. var a = 11 function test () { this.a = 22 let b = () => { consolve.log(a) } b() } var x = new test() => 11 x.a => 22
若是你耐心得看完了这四段,而且你所想的结果就是控制台的结果,那接下去你就能够不用看了,由于我要讲的你应该都懂,不过若是你有某段不明白,或者大部分不清楚,那下面的内容仍是很值得看看而且理解理解的,毕竟这些真的蛮重要。函数
执行上下文(执行环境):当JavaScript代码执行的时候,会进入不一样的执行上下文,这些执行上下文会构成了一个执行上下文栈(Execution context stack,ECS)。这个上下文栈就是js执行程序的基础。this
this: 它是动态的,有人称它为动态上下文,我以为不太对,this
指向一个环境对象(表明这个执行环境),这是一个对象,并且是一个普通对象,而不是指向一个执行环境。.net
函数(function): 函数它本身就是一个对象,它用来装一些等着执行的代码,像层壳同样,你不用它,它里面的代码是不会执行的,它身上绑着this
(因此函数有本身的执行环境)。prototype
new : 用到new
说明有函数被看成构造函数来调用了。new
会返回一个对象,像这里var x = new test()
的变量x就指向这个返回出来的对象,new在返回对象以前会把函数壳里面的代码拿出来执行一遍,可是,此时壳被剥去了,构造函数里面的函数执行环境天然就变了,就像这里的:code
let b = () => { consolve.log(this.a) } b()
天然b()
暴露给了这会儿在外面的执行环境(控制台的话是window),可是构造函数会将本身的this
给它建立出来的对象(也能够说给出的this成了这个对象),因而this.a = 22
,a
这个属性被挂到了新建的对象上。
最后专业点的话能够这样模拟一下new作的一系列操做(这样就扯到原型链继承的东西了这里暂时不须要管):对象
new Animal("cat") = { var obj = {}; // 新建一个对象 obj.__proto__ = Animal.prototype; // 实现原型链 var result = Animal.call(obj,"cat"); // 用call给this return typeof result === 'object'? result : obj; }
箭头函数:这个es6出来的,如今运用普遍的东西跟函数有点不太同样,我这里只讨论一点,就是它本身身上根本没绑着this
。因此在它里面调用this
须要往父级去找,也就是它的this
是继承自父执行环境的,而不是像有些人对其的解释,它的this
一开始就固定了。也正是由于它没有this
,因此也就不能用做构造函数,也就无法new
。虽然最后结果是对的,但解释不太对。blog