不畏惧失败是创造力的一个基本要素。——<艾尔文·兰德博士>
作者:Ashish Lahoti
译者:cl9000
来源:https://codingnconcepts.com/javascript/this-keyword-in-javascript/
JavaScript
中的 this
关键字是一个非常重要的概念,但同时也非常容易混淆。
在JavaScript
中,this
关键字指的是它所属的对象。它有不同的值取决于它被使用的地方:
- 在方法中,
this
引用定义方法的所有者对象
。 - 单独使用,
this
引用全局对象
。 - 在函数中,
this
指向全局对象
。 - 在严格模式的函数中,
this
是undefined
。 - 当一个函数使用
new
关键字调用时,this
引用新的对象实例 - 在DOM事件中,
this
指的是接收事件的元素。 - 函数原型方法
call()
、apply()
和bind()
可用于将this
指向任何对象。
this
在方法中
当执行对象的方法时,this
将引用定义了方法的对象。
在下面的示例中,this
引用person
对象,因为fullName()
方法是在person
对象中定义的。
1 | var person = { |
下面再看一个例子obj1
和obj2
在执行它们自己的increment()
方法,这里this
分别指obj1
和obj2
1 | var increment = function(){ |
Output
2
3
this
单独使用
当你单独使用this
时,它引用全局对象
我们看一下单独使用时this
的值:
1 | console.log(this); //this = window |
Output
Window {parent: Window, opener: null, top: Window, length: 4, frames: Window, …}
我们看到this
是指Window
对象,它是浏览器的全局对象。
记住: 在严格模式下,单独使用时,this
也引用全局对象。
this
在函数中(默认)
对于一个函数(位于顶层或不在任何函数内部),this
引用全局对象。
1 | function topLevelFunction(){ |
在上面的例子中,this
指的是浏览器的全局对象window
this
在函数中(严格)
然而,对于处于严格模式的函数(位于顶层或不在任何函数内部),this
指的是undefined
请看下面的例子,在严格模式函数中this
指的是undefined
:
1 | ; |
再举一个例子,如果在严格模式下调用increment()
函数,this
引用undefined
并抛出错误。
1 | var a = 1; |
Output
Uncaught TypeError: Cannot read property ‘a’ of undefined
this
with new
当使用new
关键字调用函数时,该函数被称为构造函数并返回一个新对象。在本例中,this
指的是一个新创建的对象。
1 | var Person = function(firstName, lastName){ |
Output
Albert Einstein
Isaac Newton
this
with 显示绑定
函数有call()
, apply()
和bind()
原型方法,可以在函数上调用它们来显式地改变this
上下文。
我们逐一查看这些方法,并看看它们之间的区别
call()
1 | ƒ.call(this, arg1, arg2, ...) |
当使用call()
方法调用函数时,
- 第一个参数由this引用
- 后面的逗号分隔的参数是方法参数
记住:
call
()参数用逗号分隔。
apply()
1 | ƒ.apply(this, [arg1, arg2, ...]) |
当使用apply()
方法调用函数时,
- 第一个参数由
this
引用 - 第二个参数是一个值数组,都是方法参数
记住:
apply()
接受数组形式的参数
bind()
1 | ƒ.bind(this) |
使用bind()
方法调用函数时
传递给bind()
函数的参数由this引用
返回新的绑定函数,其上下文被this
传递参数
记住:
bind()
方法不调用函数。它返回一个可以稍后调用的新函数。
我们看一个例子,如何使用这三个函数原型方法call(), apply()和bind()
1 | let numObj1 = {num: 1}; |
output:
11
12
11
12
11
12
参考
- 原文- https://codingnconcepts.com/javascript/this-keyword-in-javascript/
- MDN - https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/this
关注【公众号】,了解更多。
关注【公众号】,了解更多。
关注【公众号】,了解更多。
-
Previous
JavaScript 中 == 和 === 比较运算符的区别 -
Next
JavaScript中的 Lexical Scope(词法范围)、Closures(闭包)和Currying(柯里化)
赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!