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 相关文章推荐
CheckBox 如何实现全选?
Jun 23 Javascript
用js实现的仿sohu博客更换页面风格(简单版)
Mar 22 Javascript
JavaScript对IE操作的经典代码(推荐)
Mar 10 Javascript
jQuery中animate动画第二次点击事件没反应
May 07 Javascript
Javascript中Date类型和Math类型详解
Feb 27 Javascript
jQuery动态生成表格及右键菜单功能示例
Jan 13 Javascript
Javascript基础回顾之(三) js面向对象
Jan 31 Javascript
javascript实现数据双向绑定的三种方式小结
Mar 09 Javascript
vue项目中使用百度地图的方法
Jun 08 Javascript
Vue组件基础用法详解
Feb 05 Javascript
JavaScript中的this妙用实例分析
May 09 Javascript
Vue 列表页带参数进详情页的操作(router-link)
Nov 13 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注销代码(session注销)
2012/05/31 PHP
php中session与cookie的比较
2015/01/27 PHP
PHP多态代码实例
2015/06/26 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
javascript代码加载优化方法
2011/01/30 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
jquery拖拽效果完整实例(附demo源码下载)
2016/01/14 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
python防止随意修改类属性的实现方法
2019/08/21 Python
python实现的按要求生成手机号功能示例
2019/10/08 Python
python中提高pip install速度
2020/02/14 Python
python实现扫雷小游戏
2020/04/24 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
一些网络技术方面的面试题
2014/05/01 面试题
法学专业个人求职信
2013/09/26 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
学校搬迁方案
2014/06/15 职场文书
师范毕业生求职信
2014/07/11 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
电影雨中的树观后感
2015/06/15 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL