# this指向问题
this应该是第一个让人对JavaScript困惑的问题了,但是实际上它的原理非常简单:**函数的this在运行时绑定**。
什么叫运行时绑定?就是函数的this**和你写在哪里无关**,而是和**谁调用它有关**。谁调用这个函数,this就指向谁。
你现在大概会在想:原来这么简单,我精通了!
那可就大错特错了,可千万别忘了光函数的调用方法就有两种:直接调和new一个,而能做这两个操作的地方可以说非常的多,所以还需要往下看。
注意:以下例子均为严格模式下运行,非严格模式这里不做考虑。
## 初级
```js
function f1 () {
console.log(this)
}
f1();
```
问结果是什么?先问自己:谁调用的它?你应该一下看不出来,这明明就是直接调的啊!可能有的基础比较扎实的人会说**是window**,那真是非常的恭喜你了,但你要注意的是以上代码在严格模式下是undefined。
正解: window / undefined
```js
const foo = {
bar: 10,
fn: function() {
console.log(this)
console.log(this.bar)
}
}
let fn1 = foo.fn
fn1()
```
结果是什么?你可能一眼看到fn是定义在foo对象里,那this可不就是foo吗,刚刚说什么来着,先问自己:**谁调用的它**,来看最后一行再回答一遍。
正解:window / undefined
## 中级
```js
const foo = {
bar: 10,
fn: function() {
console.log(this)
console.log(this.bar)
}
}
foo.fn()
```
现在你应该已经有点感觉了,来,说出来,谁调用的它fn?
正解:foo
## 中级+
```js
const person = {
name: '橙子',
brother: {
name: '河浪',
fn: function() {
return this.name
}
}
}
console.log(person.brother.fn())
```
看能不能过关斩将,谁调用的fn?
正解:brother
## call / bind / apply
此为3种**干预this**指向的操作,限于篇幅不展开讲。
## 箭头函数
箭头函数可以让你省很多事,因为它的this一般来说都是符合你的直觉的:它的this就是定义时候的this。
> 本文作者: 不爱喝橙子汁
- 自述
- 学会提问
- 起步
- 安装
- 版本升级
- 1.x 升级 2.x 常见问题
- 命令行模式下node-sass安装错误
- 查看版本
- uView UI 1.x 相关问题
- 安装
- Popup 弹窗
- tabs 标签
- Waterfall 瀑布流
- Table 表格
- Dropdown 下拉菜单
- uview-ui组件篇
- u-upload监听beforeRead事件无效
- 组件怎么关不了
- 导航栏不默认返回好麻烦
- ref怎么获取不到
- z-index拉满都覆盖不了map
- u-text对手机号脱敏
- u-input的placeholder去不掉
- 服务端返回数据,form表单验证错误
- checkbox增加选中面积
- uview-ui组件篇/checkbox无法取消选中
- 小程序输入框的placeholder会穿透到弹出层
- JavaScript篇
- 判断数据类型
- 数组操作
- 节流与防抖函数
- this怎么就不对
- 计算地图上两点间的距离
- CSS篇
- 我要超出显示省略号
- uniapp中小程序样式穿透问题
- 关键帧与动画
- CSS动画属性总结
- 过渡与动画
- 正则表达式篇
- 身份证号
- 手机号
- 是否合法的http/https域名
- 数据处理篇
- 对数组分组
- 深拷贝对象
- 提取数组属性
- 提取对象属性
- 常见问题
- 如何给由组件触发的事件中传入自定义的参数
- 分类的双列联动
- 三级联动的实现
- 小程序预览提示包过大
- 框架安装失败
- 表格、瀑布流、下拉列表 组件为什么没有了
- tabBar组件怎么用
- 时间、日历、选择器相关问题
- 字体图标不显示
- class 或 /deep/ 不生效