js中this的指向问题归纳总结


Posted in Javascript onNovember 28, 2018

前言

js中this指向问题是个老生常谈的问题了,下面这篇文章再来给大家介绍下,大家可以看看,更深入的了解了解,下面话不多说了,来一起看看详细的介绍吧

this

this:上下文,会根据执行环境变化而发生指向的改变.

1.单独的this,指向的是window这个对象

alert(this); // this -> window

2.全局函数中的this

function demo() {
 alert(this); // this -> window
}
demo();

在严格模式下,this是undefined.

function demo() {
 'use strict';
 alert(this); // undefined
}
demo();

3.函数调用的时候,前面加上new关键字

所谓构造函数,就是通过这个函数生成一个新对象,这时,this就指向这个对象。

function demo() {
 //alert(this); // this -> object
 this.testStr = 'this is a test';
}
let a = new demo();
alert(a.testStr); // 'this is a test'

4.用call与apply的方式调用函数

function demo() {
 alert(this);
}
demo.call('abc'); // abc
demo.call(null); // this -> window
demo.call(undefined); // this -> window

5.定时器中的this,指向的是window

setTimeout(function() {
 alert(this); // this -> window ,严格模式 也是指向window
},500)

6.元素绑定事件,事件触发后,执行的函数中的this,指向的是当前元素

window.onload = function() {
 let $btn = document.getElementById('btn');
 $btn.onclick = function(){
 alert(this); // this -> 当前触发
 }
}

7.函数调用时如果绑定了bind,那么函数中的this指向了bind中绑定的元素

window.onload = function() {
 let $btn = document.getElementById('btn');
 $btn.addEventListener('click',function() {
 alert(this); // window
 }.bind(window))
}

8.对象中的方法,该方法被哪个对象调用了,那么方法中的this就指向该对象

let name = 'finget'
let obj = {
 name: 'FinGet',
 getName: function() {
 alert(this.name);
 }
}
obj.getName(); // FinGet
---------------------------分割线----------------------------
let fn = obj.getName;
fn(); //finget this -> window

腾讯笔试题

var x = 20;
var a = {
 x: 15,
 fn: function() {
 var x = 30;
 return function() {
  return this.x
 }
 }
}
console.log(a.fn());
console.log((a.fn())());
console.log(a.fn()());
console.log(a.fn()() == (a.fn())());
console.log(a.fn().call(this));
console.log(a.fn().call(a));

答案

1.console.log(a.fn());

对象调用方法,返回了一个方法。

# function() {return this.x}

2.console.log((a.fn())());

a.fn()返回的是一个函数,()()这是自执行表达式。this -> window

# 20

3.console.log(a.fn()());

a.fn()相当于在全局定义了一个函数,然后再自己调用执行。this -> window

# 20

4.console.log(a.fn()() == (a.fn())());

# true

5.console.log(a.fn().call(this));

这段代码在全局环境中执行,this -> window

# 20

6.console.log(a.fn().call(a));

this -> a

# 15

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript 动态参数判空操作
Dec 22 Javascript
javascript 用记忆函数快速计算递归函数
Mar 15 Javascript
JS简单的图片放大缩小的两种方法
Nov 11 Javascript
javascript打印输出json实例
Nov 11 Javascript
js带前后翻页的图片切换效果代码分享
Sep 08 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
Oct 08 Javascript
jQuery+css实现的换页标签栏效果
Jan 27 Javascript
Vue.js每天必学之方法与事件处理器
Sep 06 Javascript
全面解析Bootstrap表单样式的使用
Sep 09 Javascript
HTML Table 空白单元格补全的简单实现
Oct 13 Javascript
javascript 秒表计时器实现代码
Mar 09 Javascript
微信小程序后端实现授权登录
Feb 24 Javascript
基于vue实现移动端圆形旋钮插件效果
Nov 28 #Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
Nov 28 #Javascript
Vue触发式全局组件构建的方法
Nov 28 #Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
Nov 28 #Javascript
jQuery实现购物车的总价计算和总价传值功能
Nov 28 #jQuery
vue与原生app的对接交互的方法(混合开发)
Nov 28 #Javascript
vue微信分享出来的链接点开是首页问题的解决方法
Nov 28 #Javascript
You might like
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
session 加入redis的实现代码
2016/07/15 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
简单的php购物车代码
2020/06/05 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
基于树莓派的语音对话机器人
2019/06/17 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
英国计算机商店:Technextday
2019/12/28 全球购物
建筑学推荐信
2013/11/03 职场文书
业务经理岗位职责
2013/11/11 职场文书
《长相思》听课反思
2014/04/10 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
行政求职信
2014/07/04 职场文书
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
2015年体育部工作总结
2015/04/02 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL
Java对文件的读写操作方法
2022/04/29 Java/Android