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 相关文章推荐
js监听输入框值的即时变化onpropertychange、oninput
Jul 13 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
Jan 14 Javascript
21个值得收藏的Javascript技巧
Feb 04 Javascript
js中document.write使用过程中的一点疑问解答
Mar 20 Javascript
用javascript关闭本窗口技巧小结
Sep 05 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
Nov 01 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
Dec 22 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
Mar 10 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
Dec 25 Javascript
Angular angular-file-upload文件上传的示例代码
Aug 23 Javascript
JavaScript Event Loop相关原理解析
Jun 10 Javascript
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
基于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中函数内引用全局变量的方法
2008/10/20 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
jQuery 表格插件整理
2010/04/27 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
python 读写、创建 文件的方法(必看)
2016/09/12 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
秋季运动会表扬稿
2014/01/16 职场文书
小学运动会入场式解说词
2014/02/18 职场文书
电子银行营销方案
2014/02/22 职场文书
大学学风建设方案
2014/05/04 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
公司市场部岗位职责
2015/04/15 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
辞职信怎么写?
2019/05/21 职场文书
python requests模块的使用示例
2021/04/07 Python
在python中读取和写入CSV文件详情
2022/06/28 Python