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 相关文章推荐
jQuery Autocomplete自动完成插件
Jul 17 Javascript
在ASP.NET中使用JavaScript脚本的方法
Nov 12 Javascript
html文本框提示效果的示例代码
Jun 28 Javascript
JS辨别访问浏览器判断是android还是ios系统
Aug 19 Javascript
一张Web前端的思维导图分享
Jul 03 Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
Mar 29 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
javascript简单进制转换实现方法
Nov 24 Javascript
基于jstree使用AJAX请求获取数据形成树
Aug 29 Javascript
axios异步提交表单数据的几种方法
Aug 11 Javascript
JS模拟浏览器实现全局搜索功能
Sep 11 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
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
php 正则表达式小结
2009/08/31 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
php cookie 详解使用实例
2016/11/03 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
Python实现登录接口的示例代码
2017/07/21 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
python将字母转化为数字实例方法
2019/10/04 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
2020/08/02 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
幼儿园春游活动方案
2014/01/19 职场文书
出纳员岗位职责
2014/03/13 职场文书
网络信息安全承诺书
2014/03/26 职场文书
婚庆答谢词
2015/01/04 职场文书