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系列之数据类型 字符串
Jun 08 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
Jan 15 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
Sep 01 Javascript
Javascript中封装window.open解决不兼容问题
Sep 28 Javascript
js实现非常简单的焦点图切换特效实例
May 07 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
May 27 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
Oct 13 Javascript
解决VUEX刷新的时候出现数据消失
Jul 03 Javascript
妙用缓存调用链实现JS方法的重载
Apr 30 Javascript
深入分析element ScrollBar滚动组件源码
Jan 22 Javascript
原生js实现俄罗斯方块
Oct 20 Javascript
antd多选下拉框一行展示的实现方式
Oct 31 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中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
Python实现八大排序算法
2016/08/13 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
Html5新增标签有哪些
2017/04/13 HTML / CSS
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
质检部职责
2013/12/28 职场文书
班训口号大全
2014/06/18 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
总结Python连接CS2000的详细步骤
2021/06/23 Python
pandas进行数据输入和输出的方法详解
2022/03/23 Python
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL
java实现面板之间切换功能
2022/06/10 Java/Android