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+mapbar实现地图定位
Apr 09 Javascript
基于JQuery实现CheckBox全选全不选
Jun 27 Javascript
js统计页面的来访次数实现代码
May 09 Javascript
jquery使用ul模拟select实现表单美化的方法
Aug 18 Javascript
jquery中表单 多选框的一种巧妙写法
Sep 06 Javascript
JavaScript正则表达式匹配 div  style标签
Mar 15 Javascript
Node.js插件安装图文教程
May 06 Javascript
全屏滚动插件fullPage.js使用实例解析
Oct 21 Javascript
微信小程序 按钮滑动的实现方法
Sep 27 Javascript
JavaScript实现的超简单计算器功能示例
Dec 23 Javascript
详解在HTTPS 项目中使用百度地图 API
Apr 26 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
May 14 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
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
30个php操作redis常用方法代码例子
2014/07/05 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
php表单处理操作
2017/11/16 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
大学考试作弊检讨书
2014/01/30 职场文书
家长学校实施方案
2014/03/15 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
2015入党个人自传范文
2015/06/26 职场文书