JavaScript -- this的使用
JavaScript – this的使用
通过阅读MDN和各类博客复习了一下javascript中this的使用方法,之后也会继续补充相关内容
什么是this
在传统的面向对象语言中this
关键字指代了当前对象本身,或者是当前对象的一个实例,通过使用this
可以对其中方法与属性进行调用
在javascript
中this
的指向是临时决定的,而不是在创建时决定的,大多数情况下函数的调用方式决定了this
的指向
全局环境中的this
无论是否处于严格模式下,在全局环境中this都唯一指向全局对象window(浏览器下)
1 | console.log(this === window); //true |
函数环境中的this
直接调用
- 在非严格模式下直接调用函数,则函数中的this指向全局
- 在严格模式下调用函数,则此函数中的this会被赋值为undefined
- 非严格模式
1
2
3
4
5function foo() {
return this;
}
console.log(foo() === window); //true - 严格模式
1
2
3
4
5
6function foo() {
"use strict"//声明严格模式
return this;
}
console.log(foo() === undefined); //true
call(),apply()
在js中可以使用call()
或者apply()
函数来改变this
的指向
1 | var person = { |
Function.prototype
中的call()
和apply()
都可以改变this的指向,将this
值绑定到调用中的特定对象call()
与apply()
作用相同,唯一的不同点就是apply()
接收的参数必须时数组形式的
bind()
bind()
的用法与call()
和apply()
类似
this
将永久地被绑定到了bind
的第一个参数,无论这个函数是如何被调用的
function.bind(thisArg[, arg1[, arg2[, ...]]])
与call()
和apply()
不同的是call()
和apply()
会自动执行函数,而bind()
不会,bind()
会返回一个函数引用
下面附上一段摘自MDN的源码实现:
1 | if(!Function.prototype.bind){ |
过程解析:
- 将
Array.prototype.slice
赋值给变量slice
- 将
bind()
传入的第一个参数arguments[0]
记录下来,这是要绑定的this
,然后将后续参数保存到args
变量中 bind()
方法返回的是一个函数,funArgs
就是将bind()
传入的剩余参数和后续返回的函数执行时加入的参数进行拼接- 然后将
this
指向之前的第一个参数arguments[0]
关于面试中常见的手写call()和apply()方法题目
浏览了不少博客和文章,发现手写call()
,apply()
,和bind()
是比较常见的面试题目,因此我也总结了一下call()
和apply()
的方法
手动实现call()方法
1 | Function.prototype.myCall = function(context) { |
手动实现apply()方法
1 | Function.prototype.myApply = function(context) { |
参考MDN相关词条:Function.prototype.bind
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 幻尘の屋!
评论