浅谈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格式化货币数据实现代码
Sep 04 Javascript
浅析jquery的作用与优势
Dec 02 Javascript
jQuery实现可用于博客的动态滑动菜单
Mar 09 Javascript
JavaScript中string对象
Jun 12 Javascript
JavaScript学习总结之JS、AJAX应用
Jan 29 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
Apr 17 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
基于JavaScript实现前端文件的断点续传
Oct 17 Javascript
jquery+css3实现熊猫tv导航代码分享
Feb 12 jQuery
VeeValidate在vue项目里表单校验应用案例
May 09 Javascript
微信小程序上传图片功能(附后端代码)
Jun 19 Javascript
vue elementUI table 自定义表头和行合并的实例代码
May 22 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
php中opendir函数用法实例
2014/11/15 PHP
完美的php分页类
2017/10/24 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
关于js类的定义
2011/06/28 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
python xml解析实例详解
2016/11/14 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
用django设置session过期时间的方法解析
2019/08/05 Python
Pytorch to(device)用法
2020/01/08 Python
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
保安自我鉴定范文
2013/12/08 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
六年级学生期末评语
2014/12/26 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
Python实现byte转integer
2021/06/03 Python
MySQL常用慢查询分析工具详解
2022/08/14 MySQL