浅谈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 相关文章推荐
JavaScript实现页面实时显示当前时间的简单实例
Jul 20 Javascript
在父页面调用子页面的JS方法
Sep 29 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
Feb 21 Javascript
js时钟翻牌效果实现代码分享
Jul 31 Javascript
详解vue与后端数据交互(ajax):vue-resource
Mar 16 Javascript
基于Vue过渡状态实例讲解
Sep 14 Javascript
详解webpack中的hash、chunkhash、contenthash区别
Jan 05 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
May 01 Javascript
vue-router beforeEach跳转路由验证用户登录状态
Dec 26 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
Feb 22 Javascript
详解在网页上通过JS实现文本的语音朗读
Mar 28 Javascript
tsconfig.json配置详解
May 17 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
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
javascript 写类方式之五
2009/07/05 Javascript
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
wxPython框架类和面板类的使用实例
2014/09/28 Python
Python入门篇之字符串
2014/10/17 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
python微信公众号之关注公众号自动回复
2018/10/25 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
特步官方商城:Xtep
2017/03/21 全球购物
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
如何利用cmp命令比较文件
2016/04/11 面试题
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
业务部门经理岗位职责
2014/02/23 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
邀请函范文
2015/02/02 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python