浅谈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下给元素添加事件的方法与代码
Aug 13 Javascript
制作高质量的JQuery Plugin 插件的方法
Apr 20 Javascript
iframe实用操作锦集
Apr 22 Javascript
JavaScript中的Math.atan2()方法使用详解
Jun 15 Javascript
浅谈JavaScript中数组的增删改查
Jun 20 Javascript
浅谈js函数的多种定义方法与区别
Nov 29 Javascript
JavaScript运动框架 多物体任意值运动(三)
May 17 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
Aug 02 Javascript
vue通过style或者class改变样式的实例代码
Oct 30 Javascript
js实现每日签到功能
Nov 29 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
Nov 12 Javascript
使用vuex-persistedstate本地存储vuex
Apr 29 Vue.js
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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
PHP读取MySQL数据代码
2008/06/05 PHP
ezSQL PHP数据库操作类库
2010/05/16 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
php 可变函数使用小结
2018/06/12 PHP
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
js实现分割上传大文件
2016/03/09 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
深度解读vue-resize的具体用法
2020/07/08 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
Python线程的两种编程方式
2015/04/14 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
python 日期操作类代码
2018/05/05 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
德国童装购物网站:NICKI´S.com
2018/04/20 全球购物
求职自我评价范文
2015/03/09 职场文书
材料采购员岗位职责
2015/04/03 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
学习nginx基础知识
2021/09/04 Servers
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers