当然通俗函数应用setTimeout的话会让this指向指向Window对象的。demo代码如下
function test () { setTimeout(function () { console.log(this); }, 0)}test.call({a: 'this is obj'})// Window {...}这里可能会牵扯到setTimeout的一些点了,具体这里我就不匠了棘想深刻懂得的猛戳这里
箭头函数琅绫擎还有一些特别的点,这里因为只说起this章一?点,其他比如不绑定arguments,super(ES6),抑或 new.target(ES6),他们都和this一样,他会找寻到当前函数的arguments等。
关于箭头函数琅绫擎的this这里也有具体的介绍,想深刻懂得的可以自行浏览
- 英文原版(需翻墙)
- 中文翻译版
二、原型/原型链
function test () { setTimeout(() => { console.log(this); }, 0)}test.call({a: 'this is obj'})// Object {a: 'this is obj'}其实我们一看到原型/原型链都能和持续联想到一路,我们这里就把两块先拆开来讲解,这里我们就先零丁把原型/原型链拎出来。起首我们本身问一下本身,什么是原型?什么是原型链?
- 原型:即每个function函数都有的一个prototype属性。
- 原型链:每个对象和原型都有原型,对象的原型指向原型对象,而父的原型又指向父的父,这种原型层层连接起来的就构成了原型链。
似乎说的有点绕,其实一张图可以解释一切

function Test () { this.a = 'this is Test';}Test.prototype = { b: function () { console.log("this is Test's prototype"); }}function Test2 () { this.a = 'this is Test2'}Test2.prototype = new Test();var test = new Test2();test.b();console.log(test.prototype);console.log(test);其履行结不雅如下
更多关于持续的点,这里就不说起了,我会在持续这一章节做具体的讲解。那么“零丁”关于原型/原型链的点就这些了。
总结:原型即prototype,它只是所有function上的一个属性罢了,真正的“大年夜佬”是__proto__,“大年夜佬”指向谁,谁才能规语语权(当然可能因为“大年夜佬”过于强暴,所以在ECMA-262之后才被Standard化)。
三、持续
关于持续,之前我有写过一篇博文对持续的一些主流方法进行过总结。想具体懂得的请点击传送门。这里我们经由过程指向这个概念来从新懂得一下持续。这里咱就谈两个万变不离其宗的持续方法,一个是构造函数持续,一个是原型链持续。
1、构造函数持续
其实就是膳绫擎说起到的经由过程call/apply调用,将this指向变成thisArg,具体看膳绫擎的解释,这里直接上代码
function Test () { this.a = 'this is test'; console.log(this.a); console.log(this);}function Test2 () { Test.apply(this) // or Test.apply(this)}var test = new Test2();// this is test// Test2 {a: 'this is test'}2、原型链持续
一般情况,我们做原型链持续,会经由过程子类prototype属性等于(指向)父类的实例。即
Child.prototype = new Parent();
那么如许的做法具体是怎么实现原型链持续的呢?
起首在讲解持续前,我们须要get到一个点,那就是对象{ }它内部拥有的一些属性,这里直接看张图
如上图所示,我们看到对象{ }它本身拥有的属性就是膳绫擎我们说起到的__proto__原型指针以及一些办法。
接下来我先说一下new关键字具体做的一件工作。其过程大年夜致分为三步,如下
看到膳绫擎的例子,我们都知道说:“谜底会打印4次4”。那么为什么会如许呢?我想依次打印0,1,2,3又该怎么做呢?

var obj= {}; // 初始化一个对象objobj.__proto__ = Parent.prototype; // 将obj的__proto__原型指针指向父类Parent的prototype属性Parent.call(obj); // 初始化Parent构造函数大年夜这里我们看出来,信赖大年夜家也能懂得为什愦我在膳绫擎说__proto__才是真正的“大年夜佬”。
这里我额外提一件我们经常干的“高端”的工作,那就是经由过程原型prototype做monkey patch。即我想在持续父类办法的同时,完成本身自力的一些操作。具体代码如下
function Parent () { this.a = 'this is Parent'}Parent.prototype = { b: function () { console.log(this.a); }}function Child () { this.a = 'this is Child'}Child.prototype = { b: function () { console.log('monkey patch'); Parent.prototype.b.call(this); }}var test = new Child()test.b()// monkey patch// this is Childvar a = 'this is window'function test () { var b = 'this is test' function test2 () { var c = 'this is test2'; console.log(a); console.log(b); console.log(c); } test2();}test();// this is window// this is test// this is test2这个是我们对于自定义的类进行持续并重写,那么如不雅是类似Array,Number,String等内置类进行持续重写的话,结不雅会是若何呢?关于这个话题我也有写过一篇博文进行过讲解,传送门
四、闭包
对于闭包,我曾经也做过总结和分享,简单的一些器械和概念这里不说起了,想懂得的可以猛戳这里。和原型链那章一张,这里会摒弃掉落本来的一些看法,这里我依旧经由过程代入指向这个概念来进行懂得。
推荐阅读
物联网是新一代信息技巧的高度集成和综合应用,对新一轮家当变革和经济社会绿色、智能、可持续成长具有重要意义。“十二五”时代,我国物联网成长取得了明显成效,与蓬勃国度保>>>详细阅读
本文标题:从指向看JavaScript中的难点
地址:http://www.17bianji.com/lsqh/36446.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示