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 相关文章推荐
JQuery 技巧和窍门整理(8个)
Apr 22 Javascript
jquery禁用右键单击功能屏蔽F5刷新
Mar 17 Javascript
基于jQuery实现文本框缩放以及上下移动功能
Nov 24 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
May 11 Javascript
js将滚动条滚动到指定位置的简单实现方法
Jun 25 Javascript
JS搜狐面试题分析
Dec 16 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
Dec 22 Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
Nov 12 Javascript
Vue插件从封装到发布的完整步骤记录
Feb 28 Javascript
vue实现日历备忘录功能
Sep 24 Javascript
jQuery 选择器用法实例分析【prev + next】
May 22 jQuery
基于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
漫威DC即将合作联动,而双方早已经秘密开始
2020/04/09 欧美动漫
松下Panasonic RF-B65电路分析
2021/03/02 无线电
PHP编写RESTful接口的方法
2016/02/21 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
Python实现优先级队列结构的方法详解
2016/06/02 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
浅谈Python中(&,|)和(and,or)之间的区别
2019/08/07 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
《藤野先生》教学反思
2014/02/19 职场文书
学校食品安全实施方案
2014/06/14 职场文书
法学专业毕业实习自我鉴定2014
2014/09/27 职场文书
高考学习决心书
2015/02/04 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
2019年思想汇报
2019/06/20 职场文书
MySQL transaction事务安全示例讲解
2022/06/21 MySQL