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 面向对象 function类
May 13 Javascript
封装的原生javascript弹出层代码
Sep 24 Javascript
Js sort排序使用方法
Oct 17 Javascript
利用JS判断用户是否上网(连接网络)
Dec 23 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
Apr 03 Javascript
AngularJS通过$location获取及改变当前页面的URL
Sep 23 Javascript
使用JS正则表达式 替换括号,尖括号等
Nov 29 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
Nov 30 Javascript
学习vue.js中class与style绑定
Dec 03 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
Jan 15 Javascript
vue集成kindeditor富文本的实现示例代码
Jun 07 Javascript
小程序使用分包的示例代码
Mar 23 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.ini中文版(1)
2006/10/09 PHP
PHP4之COOKIE支持详解
2006/10/09 PHP
WordPress中"无法将上传的文件移动至"错误的解决方法
2015/07/01 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
python中加背景音乐如何操作
2020/07/19 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
python 中的@运算符使用
2021/05/26 Python
Redis+AOP+自定义注解实现限流
2022/06/28 Redis