浅谈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 相关文章推荐
jquery.Jwin.js 基于jquery的弹出层插件代码
May 23 Javascript
jquery入门—访问DOM对象方法
Jan 07 Javascript
innerText和textContent对比及使用介绍
Feb 27 Javascript
jQuery contains过滤器实现精确匹配使用方法
Apr 12 Javascript
js获取GridView中行数据的两种方法 分享
Jul 13 Javascript
删除select中所有option选项jquery代码
Aug 12 Javascript
JavaScript多并发问题如何处理
Oct 28 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
Jun 20 Javascript
jquery一键控制checkbox全选、反选或全不选
Oct 16 jQuery
详解如何模拟实现node中的Events模块(通俗易懂版)
Apr 15 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
Jul 28 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/03/04 新手入门
逐步提升php框架的性能
2008/01/10 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
Python3基础之基本运算符概述
2014/08/13 Python
Python线程中对join方法的运用的教程
2015/04/09 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
python 深度学习中的4种激活函数
2020/09/18 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
2014年财务个人工作总结
2014/12/08 职场文书
检讨书模板大全
2015/05/07 职场文书
病假证明模板
2015/06/19 职场文书
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL