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 页面内容搜索,类似于 Ctrl+F功能的实现代码
Aug 13 Javascript
JS自动缩小超出大小的图片
Oct 12 Javascript
JQuery each打印JS对象的方法
Nov 13 Javascript
二叉树先序遍历的非递归算法具体实现
Jan 09 Javascript
js无刷新操作table的行和列
Mar 27 Javascript
jQuery解决浏览器兼容性问题案例分析
Apr 15 Javascript
浅谈JavaScript对象与继承
Jul 10 Javascript
微信小程序(三):网络请求
Jan 13 Javascript
vuex提交state&&实时监听state数据的改变方法
Sep 16 Javascript
JS实现简易计算器
Feb 14 Javascript
Taro小程序自定义顶部导航栏功能的实现
Dec 17 Javascript
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
深入PHP curl参数的详解
2013/06/17 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
简略的前端架构心得&&基于editor为例子的编码小技巧
2010/11/25 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
python练习程序批量修改文件名
2014/01/16 Python
python实现socket客户端和服务端简单示例
2014/02/24 Python
tornado捕获和处理404错误的方法
2014/02/26 Python
wxPython窗口中文乱码解决方法
2014/10/11 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
python简单操作excle的方法
2018/09/12 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
提升python处理速度原理及方法实例
2019/12/25 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
水电工岗位职责
2014/02/12 职场文书
运动会观后感
2015/06/09 职场文书
常住证明范本
2015/06/23 职场文书
贷款担保书范本
2015/09/22 职场文书
Python使用MapReduce进行简单的销售统计
2022/04/22 Python