理解 this 绑定
栏目: JavaScript · 发布时间: 5年前
内容简介:名不正则言不顺。今天我们来整理下也就是说,this 并不是具体的什么东西。它只有在函数运行的时候才会存在,它存在于运行时的世界中。所以当你看到
this
是什么?现在请不要往下看,告诉自己一个答案,什么是 this?它是一个指针?一个对象还是一个函数?其实远没有那么复杂!
this 是什么
名不正则言不顺。今天我们来整理下 this
的简单定义! this
是 Javascript 中的一个 关键字
,它代表了函数调用的上下文。
- 如果包含 this 的函数是被对象作为方法调用的,this 就指向这个调用对象,这个时候可以说, this 是一个对象(默认绑定)
- 如果该函数是直接调用的,那么在严格模式下,this 指向 undefined,非严格模式下 this 指向 window(隐式绑定)
- 如果 this 是通过 new 关键字调用的,也就是通过构造函数调用的,那么 this 指向 new 返回的对象实例(隐式绑定,可以理解为构造函数时一种特殊的函数)
- 如果 this 是通过 apply,call,bind 调用,那么 this 指向调用是绑定的对象(显式绑定)
也就是说,this 并不是具体的什么东西。它只有在函数运行的时候才会存在,它存在于运行时的世界中。所以当你看到
function call() { /* 这里有很多代码*/ console.log(this); /* 这里有很多代码*/ } 复制代码
这样的代码的时候,this 在这里并没有什么意义。我们应该关注的是在什么时候 call()
和 如何 call()
。现在请简单复习下,当我们通过下面几种方式调用的时候, this 关键字指向了哪里?
new call(); call(); call.bind(null,); call.apply(null, []); 复制代码
如何定位 this
关于定位 this,先介绍一个简单粗暴的万金油来说明如何判断;
- 是否有点操作符?如果有,左边的就是 this
- 是否有 call 或者 apply?如果有,第一个逗号传进来的,就是 this
- 方法是被单独调用的吗?如果是,全局对象上下文,就是 this
通过这三点,我们可以判断出绝大多数的 this 指向。少部分的就是上面提到的通过构造函数调用的方式。请看下面这个例子:
var p2 = null; function Person(name) { this.name = name; this.age = 8; console.log(this); // {name: 'todd', age: 8} p2 = this; } var p1 = new Person('todd'); console.log(p1 === p2) // true 复制代码
我们看到,当函数(构造函数) Person 通过关键字调用的时候,此时 this 并没有指向全局上下文,而是指向 new 操作符返回的对象。通过 p1 === p2 的结果可以证明。this 的判断规则十分简单,只要记住前面提到的三种方法再加上 new 关键字的场景,我们可以对全部 this 的调用场景做以区分。比如:
var name = "windowsName"; var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: function () { setTimeout( function () { this.func1() },100 ); } }; a.func2() // this.func1 is not a function 复制代码
这道题目的 this,看似花里胡哨。其实我们只要根据第三点判断就轻而易举。this 的运行时是在一个定时器中,因为它是匿名函数被单独调用,其上下文是全局,所以没有func1 这个方法。所以必然报错。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 深入理解es6读后总结--块级作用域绑定
- Golang Echo数据绑定中time.Time类型绑定失败
- 如何在Symfony的表单中添加一个未绑定字段,否则绑定到一个实体?
- js双向绑定
- 延迟静态绑定——static
- 绑定自定义事件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web 2.0界面设计模式
黄玮 / 电子工业出版社 / 2013-9-1 / 59
本书集Web 2.0的发展及特点、Web 2.0界面设计模式基本理论、实际模式实践及代码实现等诸多内容于一身,具有很强的实用性。这些内容不是简单的顺序堆砌,而是以Web 2.0界面设计模式和应用为主线,其中完美地穿插了各种与之相关的Web 2.0设计理念、用户行为模式、用户体验及基于Dojo的实现方式等相关知识,真正做到将Web 2.0界面设计模式所需要的方方面面的知识有机地融为一个整体。实现不需......一起来看看 《Web 2.0界面设计模式》 这本书的介绍吧!