
javaScript函数中关于this的指向问题
全局函数中的this:如果你在全局作用域中定义了一个函数,且没有使用new关键字调用,那么this会指向全局对象window。例如: 构造函数中的this:使用new关键字创建的对象,this会指向新创建的对象实例。例如: 严格模式下的this:在JavaScript的严格模式下,如果没有明确指定this的值,this会被设置为undefined,而不是window。需要注意的是,严格模式是在函数的开始时使用"use strict"声明的。 事件处理中的this:在事件处理中,this通常指向触发事件的元素对象。例如,在HTML事件中: 函数内部的this:在函数内部,this的值会根据函数的调用方式而变化。例如,在函数fn()中,若fn()被作为方法调用,this会指向该方法所属的对象;若fn()被作为函数直接调用,this会指向全局对象window。 返回非对象值作为函数返回值:如果函数返回一个非对象值(如数字、字符串等),则this会指向函数的调用者。 构造函数中的返回值:构造函数如果不返回任何值,或者返回一个非对象值,那么新创建的对象的this会指向该实例。如果构造函数返回一个对象,则this会指向返回的对象。例如:
发布日期:2021-05-07 08:01:26
浏览次数:14
分类:精选文章
本文共 1490 字,大约阅读时间需要 4 分钟。
一、this是什么?
在编程中,特别是在JavaScript中,this是一个非常重要的概念。它是函数调用时自动创建的作用域对象,具体指向取决于函数的调用方式。默认情况下,如果没有明确指定this的值,JavaScript会将其指向全局对象window。
二、this的指向
this的指向在不同的场景下会发生变化,理解这些场景对编写高质量的JavaScript代码至关重要。以下是一些常见的情况:
- 方法中的this:在方法中,this表示该方法所属的对象。例如:
var obj = { a: 1, b: function(){ console.log(this.a); // 1 } };
当调用obj.b()时,this会指向obj对象。
function fn(){ console.log(this); // window } fn();
function Fn(){ this.a = '123'; } var obj = new Fn();
在这种情况下,obj是一个Fn实例,this在构造函数中指向obj。
当用户点击按钮时,this会指向按钮元素。
三、this的特殊情况
在某些情况下,this的指向可能会有所不同,需要特别注意。以下是一些常见的特殊情况:
- 返回对象作为函数的返回值:当函数返回一个对象时,该对象会成为新的this值。例如:
function fn(){ return { name: '张三' }; }
在这种情况下,调用fn()后得到的结果是一个对象,this会指向该对象。
function Fn(){ this.a = 123; return null; } var obj = new Fn();
在这种情况下,obj的this会指向Fn的实例,但由于返回值是null,obj的a属性会是undefined。
四、总结
通过以上分析可以看出,this的指向是一个非常灵活的概念,它根据函数的调用方式和上下文而变化。在编写JavaScript代码时,明确this的指向可以帮助我们更好地理解代码的执行流程,并避免一些常见的错误。记住,理解this的指向是成为一名优秀的JavaScript开发者的一部分必备技能。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月19日 09时50分01秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
.NET微信网页开发之使用微信JS-SDK调用微信扫一扫功能
2019-03-05
.NET微信网页开发之使用微信JS-SDK获取当前地理位置
2019-03-05
Android Studio在android Emulator中运行的项目黑屏
2019-03-05
Python写代码的时候为什么要注释?Sun因此被Oracle收购
2019-03-05
JAVA高并发集合详解
2019-03-05
解决Spirng注入时名称下的红色波浪线
2019-03-05
操作系统知识概述
2019-03-05
读懂操作系统(x64)之堆栈帧(过程调用)
2019-03-05
仓储模式到底是不是反模式?
2019-03-05
VS2015安装EF Power Tools
2019-03-05
ASP.NET MVC之JsonResult(六)
2019-03-05
SQL Server之深入理解STUFF
2019-03-05
使用mybatis-generator生成底层
2019-03-05
Android APK 重签名
2019-03-05
Mybatis【3】-- Mybatis使用工具类读取配置文件以及从属性读取DB信息
2019-03-05
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
2019-03-05
Mybatis【7】-- Mybatis如何知道增删改是否成功执行?
2019-03-05
Mybatis【9】-- Mybatis占位符#{}和拼接符${}有什么区别?
2019-03-05