【转】this 的使用方法 —— javascript中的this讲解!

2023-11-05

从自己刚刚开始学习javascript到现在已经很久了,今天得益于新酱的细心讲解,总算是把this这个“雾中花”看清晰了。

在此首先感谢新酱的讲解
下面将this的一些基本使用和大家分享一下:

查看this指向的一句话法则:
 
永远指向其所在函数的所有者如果没有所有者时,指向window。
理解this的要点:关键在于将函数与函数名分开看待。同一个函数,在不同的执行方法下,会有不同的效果
 
如何来进行理解呢,来看几个实例
1)全局函数中的this指向

function test(){
alert(this);//test这个函数没有所有者,因此此时this指向的是window
}

2)对象方法中的this指向

o.test =function(){

alert(this==o);//输出true,o.test表示的是test这个函数的所有者是对象o,因此this应当是指向o的

}

3)绑定函数时的this 1
如下代码,test1和test2中this并不相同

var test2 = o.test1;//test2这个函数并没有所有者,在此,test2虽然调用了test1这个函数,但是this仍然指向window,而不是指向test1的拥有者:对象o
test2();
o.test1 =function(){

alert(this===o);

}

这便是上面所说的,要将函数与函数名分开看待
4)绑定函数时的this 2
此时如果我们对3)中的代码进行一些修改:

function test (){
alert(this=== o);
}
test();//this指向window
var o ={};
o.test2 = test;
o.test2();//此时test2的所有者为o,而test没有所有者,this在此时指向的是o
alert(o.test2);

5)鼠标单击事件等进行函数的绑定时,this的指向

document.onclick=function(){

alert(this===document);//输出为true,onclick事件的拥有者是document。因此,此处this指向document。我们可以将document.onclick理解为一个对象方法,如同例4中的o.test2一样。

}

6)setTimeout等传参形式的this指向
不要去看传的参数中函数的所有者,看执行函数的所有var obj = {};

obj.x =1;
obj.y =2;
window.x =100;
window.y =200;
obj.add =function(){
alert(this.x +this.y);
}
setTimeout(obj.add,1000);//this指向window,输出为300
setTimeout(function(){//this指向obj,输出为3
obj.add();
},1000);

改变this的方法:call,apply
call和apply(两者用于改变函数的作用域)

var oo ={};
oo.test3 =function(){
alert(this== oo);//返回false
}
var ooo ={};
oo.test3.call(ooo);//this指向的是()内的第一个参数,此处为ooo

 


window.x =100;
var oo ={};

oo.test3 =function(y,z,k){//函数的参数与apply、call中第二个以及之后的参数相对应
alert(this.x+y+z+k);
}
var arr=[2,3,4]
oo.test3.call(window,2,3,4);//this指向window,输出为109
oo.test3.apply(window,[2,3,4]);//同上,使用apply进行元素罗列时需要使用中括号[]将所有参数包裹起来
oo.test3.apply(window,arr);//同上,使用apply对于一个数组的访问很简单,使用数组名称即可
oo.test3.call(window,arr[0],arr[1],arr[2]);//同上

 

博客来源:http://blog.163.com/hongshaoguoguo@126/blog/static/18046981201251935720333/ 

by 独行冰海

 

转载于:https://www.cnblogs.com/GeekHacker/archive/2012/06/24/this_520.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【转】this 的使用方法 —— javascript中的this讲解! 的相关文章

  • WebDriver click() 与 JavaScript click()

    故事 在 StackOverflow 上 我看到用户报告他们无法通过 selenium WebDriver 单击 命令单击元素 并且可以通过执行脚本通过 JavaScript 单击来解决该问题 Python 中的示例 element dri
  • 无限水平滚动 Div

    我需要一个 div 当您将鼠标进一步向右或向左移动时 它会水平滚动 我发现 Smooth Div Scroll 插件 http www smoothdivscroll com 非常接近我的需要 然而 这存在一些问题 我需要能够使滚动元素从设
  • firebug 打开后断点重复触发

    当我在一个站点上打开 firebug 时 我无法分析任何内容 因为每隔几秒就会在该行上触发一个断点 function function a try function b i if i i length 1 i 20 0 function c
  • 使用 jquery UI 调整大小的分屏 div

    我心中有一个设计 涉及 html 中的拆分面板视图 类似于 winforms 拆分面板 我一直在尝试jQuery UI 可调整大小 http jqueryui com demos resizable我喜欢这个功能 我只是似乎无法协调两者的大
  • 如何连接我的 angular2 应用程序 javascript 文件

    对于我的 Angular2 TypeScript 应用程序 我将所有 js 文件合并到一个 app min js 文件中 然后 System import 将此文件导入到我的 index html 页面 然后我得到一个同一模块文件中的多个匿
  • 如何在严格模式下设置元素样式属性?

    Given body document getElementsByTagName body 0 iframe document createElement iframe iframe src protocol settings script
  • .addClass 仅添加到无序列表中单击的项目符号

    我有一个简短的无序列表 其中有两个项目符号 我添加了一些 Javascript 这样当我单击项目符号时 它会向其中添加一个类 问题是 它将该类添加到所有现有的 li 中 而不仅仅是我单击的那个 这是 JSFiddle http jsfidd
  • javaScript从单个值数组返回一个新的成对值数组[重复]

    这个问题在这里已经有答案了 可能的重复 将数组分割成块 https stackoverflow com questions 8495687 split array into chunks 我正在尝试将值数组转换为新的配对值数组 例如我需要转
  • 单击链接时如何将另一个 JSP 页面注入到

    我在一个JSP页面中有两个不同的部分 其中一个包含链接菜单 单击时 div2 id content 会相应加载不同的页面 我正在做类似的事情 div ul class navbar li a href Login jsp Login a l
  • 为什么 jQuery 的 .change() 事件仅在单击鼠标右键时触发?

    我在使用 jquery 时遇到了问题 change 当我修改输入元素时发生事件 据说 每当我对所述元素进行实时更改时 该事件就会触发 但就我而言 它仅在我按下右键单击按钮后才会触发 这是我的代码laravel框架 HTML div clas
  • 如何编写具有依赖状态的 redux 减速器

    我正在开发一个 React Redux 应用程序 它允许将 小部件 添加到页面并在 2D 空间中进行操作 要求可以同时选择和操作多个小部件 我当前状态树的简化版本如下所示 widgets widget 1 x 100 y 200 widge
  • 使用 javascript/jquery 检查 .css 样式表的名称

    我正在尝试为论坛制作一个小 chrome 扩展 但我只希望它在论坛的某个区域中工作 问题是我不能只做 matches subforum 因为该论坛中的线程无法通过 URL 区分它们所在的子论坛 subforum 有自己的 css 样式表 所
  • onbeforeunload 或单击浏览器后退按钮需要帮助

    如果用户单击浏览器的后退按钮 那么我希望出现提示并要求确认 如果用户单击 确定 那么它应该导航到xx html 如果用户单击 取消 则应阻止导航 我怎样才能做到这一点 注意 我已经尝试过onbeforeunload方法 但它适用于所有导航操
  • Django CBV表单提交返回的JSON显示为新页面

    我正在使用 Django 3 2 我正在创建一个简单的时事通讯订阅表格 表单提交将 JSON 返回到前端 然后应该使用前端来更新页面的部分内容 但是 当我发布表单时 JSON 字符串将在新页面上显示为文本 这是调用视图的路由 urlpatt
  • 获取与请求

    我正在使用 JSON 流并尝试使用 fetch 来使用它 该流每隔几秒发出一些数据 仅当流关闭服务器端时 使用 fetch 来使用流才可以访问数据 例如 var target the url var options method POST
  • 如何将嵌套对象数组转换为 CSV?

    我有一个包含嵌套对象的数组 例如 name 1 children name 1 1 children 1 2 id 2 thing name 2 1 children 2 2 name 3 stuff name 3 1 children 3
  • 使用 Firefox 插件发出跨域 ajax 请求

    我对如何在 Firefox 插件中发出跨域 ajax 请求感到有点困惑 LastPass 和 Xmarks 等插件建议你可以做到这一点 但是当我尝试用 google 搜索你是如何做到这一点时 每个人似乎都说你不能 除非用户在 Firefox
  • 但为什么浏览器 DOM 经过 10 年的努力仍然这么慢?

    Web 浏览器 DOM 自 90 年代末以来就已存在 但它仍然是性能 速度方面最大的限制之一 我们拥有来自 Google Mozilla Microsoft Opera W3C 和其他各种组织的一些世界上最聪明的人才 为我们所有人致力于 W
  • 使用 JavaScript 自动提交表单

  • Origin 无权使用地理定位服务 - 即使通过 HTTPS

    我有一个通过 HTTPS 使用 HTML5 地理定位的网页 它在桌面浏览器上运行良好 然而 在 iOS Safari 上 我收到错误 Origin 无权使用地理定位服务 我已确保页面上的所有内容都通过 HTTPS 加载 每个图像 每个脚本和

随机推荐

  • QT-------UI基础到进阶,干货满满!!!

    目录 一 UI基础 1 QWidget类 掌握 2 添加子组件 掌握 3 样式表 熟悉 二 UI进阶 1 Designer 设计师 掌握 2 布局 Layout 掌握 3 QWidget属性 掌握 4 UI指针 掌握 5 基础组件 熟悉 5
  • 云服务器配置环境Linux初学常用命令以及操作步骤

    云服务器Linux初学常用命令 ls 查看此目录下所有文件夹的名称 cd 返回上一个文件夹 cd 返归根目录 cd file 查看指定的文件夹 file是你自己指定的文件夹的名称 tar zxvf file 解压你指定的gz包 file是你
  • layui 日期范围选择

    layui时间范围选择 相信很多时候项目中会遇到时间范围选择 废话不多说上图 上代码 div class layui inline div class layui input inline style width 160px div div
  • “数字孪生城市”的概念,你知道多少?

    随着大数据时代的到来以及互联网 云计算 物联网 人工智能技术等新一代先进信息技术的发展 近年来陆续诞生了数字城市 智慧城市以及数字孪生城市等各种 新型城市 概念 数字城市是随着1998年美国前副总统阿尔 戈尔提出 数字地球 之后而产生的概念
  • W25Q256学习

    一 基本特性 容量256Mb 最小的组织单位是页每个页256个字节 可进行页编程 一次写256个字节 16个页组成4KB的扇区 可进行扇区擦除 128个扇区组成32KB块 64KB的组 可以整片擦除 256有8192个扇区和512个块 25
  • 在 Web.config 中,配置允许多个指定的域名进行跨域访问

    一般来说 如果是要允许跨域访问 最简单的设置 就是在 Web config 中 将 Access Control Allow Origin 设置为 即可 如下所示
  • 谈谈初级软件测试工程师具备的知识与技能

    什么是软件测试 软件测试的经典定义是 在规定的条件下对程序进行操作 以发现程序错误 衡量软件品质 并对其是否能满足设计要求进行评估的过程 软件测试的现实定义是 软件测试是贯穿整个软件开发生命周期 对软件产品 包括阶段性产品 进行验证和确认的
  • 【OpenHarmony】L1 烧录的启动参数

    OpenHarmony L1 烧录的启动参数 启动参数 linux liteos a uboot位置 linux liteos a和linux共用 启动参数 linux setenv bootargs mem 128M console tt
  • Portscan一款局域网端口扫描器

    Portscan是一款局域网端口扫描器 可以用于扫描目的主机的开放端口 并猜测目的主机的操作系统 支持Edge Wi Fi和3G网络 打开PortScan软件后默认会帮你填好超始IP及端口号 结束IP可以自已根据需求填写好 然后扫描即可 它
  • 控制台I/O显示格式化的结果

    不经常使用Console WriteLine 所以记录下所有的格式化的写法 以供分享 1 格式字符串 不考虑大小写 除了e E C 货币格式 C2 货币格式 精度为两位小数 eg 73 23 D 十进制格式 E 科学计数法 System C
  • Java入门-向下转型的安全判断

    向下转型的安全判断 向下转型的安全判断使用原因 多态实现了引用类型的向上转型 我们也可以进行向下转型 但是向下转型不一定是安全的 要先进行安全判断 只有父引用原本指向的类型和与向下转型的类型一致 才能转 因此我们需要进行向下转型的安全判断
  • SpringBoot 项目打成 .exe 程序

    https mp weixin qq com s XmNYqyZeY 1gSBxpAX4TRQ
  • 抖音设计系统Semi Design:解构、原理与实现

    摘要 本文将深入探讨抖音设计系统Semi Design 阐述其定义 分析其原理 并通过详细代码展示其实现方法 本文旨在为设计师 开发人员和相关领域的研究者提供有关Semi Design的深入理解和实用指南 引言 抖音 作为一款全球流行的短视
  • Vue+style 动态样式绑定(收藏图标)

    主要代码 0 未收藏 1 已收藏
  • 函数隐藏和函数覆盖

    函数隐藏和函数覆盖 1 函数隐藏 派生类中函数具有与基类同名的函数 参数列表不一定相同 从而派生类中隐藏了基类的同名函数 2 函数覆盖 定义 派生类中函数将基类中的函数覆盖的情况称为函数覆盖 条件 1 基类是虚函数 2 发生覆盖的两个函数分
  • static与const的区别

    一 static主要有三个作用 1 修饰局部变量 成为静态局部变量 2 修饰全局变量 成为静态全局变量 3 修饰函数 成为静态函数 1 修饰局部变量 成为静态局部变量 没有加static的情况 如果加了static会有什么变化呢 栈区 存放
  • iOS完整学习路线图

    今晚特地花时间整理出了iOS的完整学习路线图 希望对大家有帮助 FROM http blog csdn net q199109106q article details 8596506
  • stm32通过I2C接口实现温湿度(AHT20)的采集

    stm32通过I2C接口实现温湿度 AHT20 的采集 一 I2C总线协议详解 一 I2C总线物理拓扑结构 二 I2C总线协议 三 硬件I2C和模拟I2C 1 硬件I2C 2 模拟I2C 3 区别 二 实现AHT20采集程序 一 了解AHT
  • 教程四:使用物联网平台控制硬件端

    物美智能 系列文章目录 一款强大的物联网管理平台介绍 物美智能 教程一 阿里云使用docker快速部署服务端 教程二 本地配置服务端开发环境 教程三 硬件端 Arduino和ESP8266开发板入门 教程四 使用物联网平台控制硬件端 教程五
  • 【转】this 的使用方法 —— javascript中的this讲解!

    从自己刚刚开始学习javascript到现在已经很久了 今天得益于新酱的细心讲解 总算是把this这个 雾中花 看清晰了 在此首先感谢新酱的讲解 下面将this的一些基本使用和大家分享一下 查看this指向的一句话法则 永远指向其所在函数的