浅谈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 相关文章推荐
当json键为数字时的取值方法解析
Nov 15 Javascript
js实现按钮加背景图片常用方法
Nov 01 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
May 11 Javascript
AngularJS使用ng-repeat指令实现下拉框
Aug 23 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
Aug 29 Javascript
chrome浏览器如何断点调试异步加载的JS
Sep 05 Javascript
微信小程序 封装http请求实例详解
Jan 16 Javascript
AngularJs 利用百度地图API 定位当前位置 获取地址信息
Jan 18 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
Mar 08 Javascript
vue.js实例todoList项目
Jul 07 Javascript
js实现鼠标拖拽缩放div实例代码
Mar 25 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 jQuery
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递归调用的小技巧讲解
2013/02/19 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
Python查询IP地址归属完整代码
2017/06/21 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
Python的信号库Blinker用法详解
2020/12/31 Python
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
自荐信怎么写呢?
2013/12/09 职场文书
团代会宣传工作方案
2014/05/08 职场文书
信访工作汇报材料
2014/10/27 职场文书
公务员政审材料
2014/12/23 职场文书
Python学习之包与模块详解
2022/03/19 Python
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang