浅谈js中的this问题


Posted in Javascript onAugust 31, 2017

this

this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上

this的最终指向的是那个调用它的对象(这里其实并不完全对,this的指向有时候会很微妙,得靠自己去慢慢体会)

只有方法在对象上,对象调用当前方法,指向当前对象

function fnThis(){
 let user='js';
 console.log(this.user)//undefined
 console.log(this)//global(window)
}

fnThis();

这里为什么会输出一个全局的对象?因为我们申明的函数,在全局里,现在执行这个函数

实际上是全局在调用

let obj={
 user:'js',
 fn:function(){
 console.log(this.user)
 }
obj.fn();

这里是obj在调用,所以指向我们的obj,这并不能说明,我们一开始就说的this最终调用他的那个

对象

let obj={
 user:'js',
 objTwo:{
 user:'css',
 fn:function(){
  console.log(this.user)
 }
 }
}

obj.objTwo.fn();

这里只是指向了obj2,而并没有指向最终调用它的obj.

来个料咋们看看this这家伙

<button id="myBtn" value="按钮">按钮</button>
<script>

let myBtn=document.querySelector("#myBtn")
let fn=function(){
console.log(this);
}
myBtn.onclick=function(){

fn();//输出的全局

console.log(this);//输出的是这个button
}
</script>

这里从表面看,会认为第一个输出的是这个btn按钮,不是说谁调用指向谁么,但是咋们仔细看这个是btn在调用么???

其实是这个点击事件的匿名函数在调用,而这fn()本身是全局上下文的函数,它的this指向的是全局,它是作为这个匿名函数的普通函数,自然指向的全局

我们如果这样写

myBtn.onclick=fn;//btn点击的时候就指向这个btn了,这时候输出结果为这个button,

总结

1. 全局上下文,或者普通函数上下文里面的this,包括函数里面的普通函数,都是指向全局
2. 在对象方法里面的this指向该对象
3. 在事件方法里面的this指向发生事件的这个对象

特殊情况

let obj={
 user:'js',
 objTwo:{
 user:'css',
 fn:function(){
  console.log(this.user)
  console.log(this)
 }
 }
}

let objThre=obj.objTwo.fn;

objThree();

把函数赋值给了objThree,而objThree是在全局上,所以输出的是全局

补充

let chinesePeople=function(){
 this.name='张飞';
 return obj
 }

如果返回的是对象,this就指向返回的那个对象,否则就指向实例对象

改变的几种方式

let obj={a:80}
let objTwo={
 a:70,
 fn:function(){
  console.log(this.a);
 }
}

objTwo.fn.call(obj);
调用一个方法,并改变其this指向

objTwo.fn.apply(obj);
调用一个方法,并改变其this指向

前2者区别,在于后面的参数,一个是顺序,一个是数组

objTwo.fn.bind(obj)();

bind()方法会创建一个新函数,在绑定后,我们可以加括号立即执行,也可以等需要执行再执行

第一个参数对象,以后的顺序传参

new方法,其实是隐藏的调用了一个call的方法

以上这篇浅谈js中的this问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js function使用心得
May 10 Javascript
JavaScript prototype属性深入介绍
Nov 27 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
Jan 02 Javascript
jQuery+CSS3实现树叶飘落特效
Feb 01 Javascript
15款jQuery分布引导插件分享
Feb 04 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
Jun 12 Javascript
vue.js动态数据绑定学习笔记
May 19 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
Aug 21 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
Sep 14 Javascript
JS字符串去除连续或全部重复字符的实例
Mar 08 Javascript
解决vue 打包发布去#和页面空白的问题
Sep 04 Javascript
vue element-ui读取pdf文件的方法
Nov 26 Javascript
js实现图片放大展示效果
Aug 30 #Javascript
详解js几个绕不开的事件兼容写法
Aug 30 #Javascript
JavaScript实现滑动导航栏效果
Aug 30 #Javascript
详解vue-cli 构建Vue项目遇到的坑
Aug 30 #Javascript
前端开发不得不知的10个最佳ES6特性
Aug 30 #Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 #Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 #Javascript
You might like
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
MySQL数据源表结构图示
2008/06/05 PHP
说明的比较细的php 正则学习实例
2008/07/30 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
extjs tabpanel限制选项卡数量实现思路及代码
2013/04/02 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
python实现百度语音识别api
2018/04/10 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
通过cmd进入python的实例操作
2019/06/26 Python
Python requests模块cookie实例解析
2020/04/14 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
Rentalcars.com中国:世界上最大的在线汽车租赁服务
2019/08/22 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
大学生两会精神学习心得体会
2014/03/10 职场文书
探亲假请假条
2014/04/11 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
商场促销活动总结
2014/07/10 职场文书
职工小家建设活动方案
2014/08/25 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
打架检讨书
2015/01/27 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers
如何在Python项目中引入日志
2021/05/31 Python
详解MySQL中的pid与socket
2021/06/15 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js