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 相关文章推荐
Ext中下拉列表ComboBox组件store数据格式用法介绍
Jul 15 Javascript
jQuery实现预加载图片的方法
Mar 17 Javascript
JS实现简易图片轮播效果的方法
Mar 25 Javascript
非常实用的12个jquery代码片段
Nov 02 Javascript
JavaScript+CSS无限极分类效果完整实现方法
Dec 22 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
Aug 10 Javascript
Webpack实现按需打包Lodash的几种方法详解
May 08 Javascript
详解用node.js实现简单的反向代理
Jun 26 Javascript
node下使用UglifyJS压缩合并JS文件的方法
Mar 07 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
微信小程序实现商城倒计时
Nov 01 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
Jan 18 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
php compact 通过变量创建数组
2016/11/15 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
JavaScript自定义事件介绍
2013/08/29 Javascript
jquery默认校验规则整理
2014/03/24 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
python requests使用socks5的例子
2019/07/25 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
建筑实习自我鉴定
2013/10/18 职场文书
创伤外科专业推荐信范文
2013/11/19 职场文书
应届医学毕业生求职信分享
2013/12/02 职场文书
基层党员公开承诺书
2014/05/29 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
恰同学少年观后感
2015/06/08 职场文书
七年级数学教学反思
2016/02/17 职场文书
《打电话》教学反思
2016/02/22 职场文书
Python如何加载模型并查看网络
2022/07/15 Python