this详解

浏览器 指向window node js 指向global
var a = 10; function foo (){console.log(this.a)}
foo();
在严格模式下,this指向undefined.

 "use strict";var a = 10;function foo() {console.log('this1',this);console.log(window.a);console.log(this.a)
};console.log(window.foo);console.log('this2',this);foo();

严格模式的目的:
1.消除JavaScript语法中,不合理,不严谨的地方.
2.消除代码中一些不安全的地方,保证代码的安全运行.
3.提高JavaScript程序的运行效率.
4.为以后新版本的JavaScript做好准备.
在js脚本的开头添加"use strict"开启严格模式单引号同理
严格模式的特征:
1.不允许使用未声明的变量 a = ?
2.不允许删除变量或函数. delate
3.函数中不允许出现同名的参数. function(a,a){}
4.eval语句的作用域是独立的, eval(‘var a = 100’)
5.不允许使用with语句
6.不允许写入只读属性
7.不允许使用八进制数 0o
8.不能在if语句中声明函数
9.禁止使用this表示全局对象

let a = 10;const b = 20;function foo () {console.log(this.a);console.log(this.b)};foo();console.log(window.a)var a = 1;function foo () {var a = 2;console.log(this);console.log(this.a)};foo()var a=1;function foo(){var a=2;function inner(){console.log(this.a)}inner()}foo()

隐式绑定与丢失
隐式丢失其实就是被隐式绑定的函数在特定的情况下会丢失绑定对象
当使用另一个变量来给函数取别名或者将函数作为参数传递时会被隐式赋值,回调函数丢失this绑定

function foo(){console.log(this.a)};var obj={a:1,foo};var a=2;var foo2=obj.foo;obj.foo();foo2();function foo(){console.log(this.a)};var obj={a:1,foo};var a=2;var foo2=obj.foo;var obj2={a:3,foo2:obj.foo};obj.foo();foo2();obj2.foo2();function foo(){console.log(this.a)};function doFoo(fn){console.log(this);fn()};var obj={a:1,foo};var a=2 ;doFoo(obj.foo)

隐式丢失不是链
显示绑定
强行使用某些方法,改变函数内this的指向
通过call()、apply()或者bind()方法直接指定this的绑定对象
使用.call()或者.apply()的函数是会直接执行的
bind()是创建一个新的函数,需要手动调用才会执行
function foo(){console.log(this.a)};var obj={a:1};var a=2;foo();foo.call(obj);foo.apply(obj);foo.bind(obj)
如果call、apply、bind接收到的第一个参数是空或者null、undefined的话,则会忽略这个参数

function foo(){console.log(this.a)};var a=2;foo.call();foo.call(null);foo.call(undefined)var obj1={a:1};var obj2={a:2,foo1:function(){console.log(this.a)},foo2:function(){setTimeout(function(){console.log(this);console.log(this.a)},0)}};var a=3;obj2.foo1();obj2.foo2()var obj1={a:1};var obj2={a:2,foo1:function(){console.log(this.a)},foo2:function(){function inner(){console.log(this);console.log(this.a)}inner()}};var a=3;obj2.foo1();obj2.foo2()function foo(){console.log(this.a)};var obj={a:1};var a=2;foo();foo.call(obj);foo().call(obj)function foo(){console.log(this.a);return function(){console.log(this.a)}};var obj={a:1};var a=2 ;foo();foo.bind(obj);foo().bind(obj) 

// 中间被吞了的原因是因为控制台只会返回最后一个

function foo(){console.log(this.a);return function(){console.log(this.a)}};var obj={a:1};var a=2;foo.call(obj)()

//不是按链走结果为 1 2

var obj={a:1,foo:function(b){b=b||this.a;return function(c){console.log(this.a+b+c)}}};var a=2;var obj2={a:3};obj.foo(a).call(obj2,1);obj.foo.call(obj2)(1)

new绑定

function Person(name){this.name=name};var name='window';var person1=new Person('yuanrenxue');console.log(person1.name);Person(name){this.name=name;this.foo1=function(){console.log(this.name)};this.foo2=function(){return function(){console.log(this.name)}}};var person1=new Person('person1');person1.foo1();person1.foo2()();var name='window';function Person(name){this.name=name;this.foo=function(){console.log(this.name);return function(){console.log(this.name)}}};var person2={name:'person2',foo:function(){console.log(this.name);return function(){console.log(this.name)}}};var person1=new Person('person1');person1.foo()();person2.foo()();var name='window';function Person(name){this.name=name;this.foo=function(){console.log(this.name);return function(){console.log(this.name)}}};var person1=new Person('person1');var person2=new Person('person2');person1.foo.call(person2)();person1.foo().call(person2);

箭头函数绑定
箭头函数内的this是由外层作用域决定的,call对其没有影响
使用new来创建对象时发生了什么
创建(或者说构造了)一个新对象
这个新对象进行[[prototype]]连接, 将新对象的原型指向构造函数,这样新对象就可以访问到构造函数原型中的属性
改变构造函数this 的指向为新建的对象,这样新对象就可以访问到构造函数中的属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强大的系统监测工具 iStat Menus for mac最新中文激活版

iStat Menus for Mac是一款功能强大的系统监控工具,专为Mac用户设计,旨在帮助用户全面了解电脑的运行状态,提高电脑的性能和稳定性。 iStat Menus for mac最新中文激活版下载 该软件可以实时监测CPU使用率、内存占用、网络速度、硬盘活动等各…

React状态管理比较原理

一、React状态管理库 按照23年下载使用顺序依次是: ReduxZustandMobXRecoilJotaiValtio 二、各状态管理库简要概述 Redux:Redux 是一个行业标准的状态管理库,它利用 flux 架构来创建不可变的数据存储。 优点 提供可预测的、一致的状态…

java学习——消息队列MQ

上一篇传送门:点我 目前只学习了RabbitMQ,后续学习了其他MQ后会继续补充。 MQ有了解过吗?说说什么是MQ? MQ是Message Queue的缩写,也就是消息队列的意思。它是一种应用程序对应用程序的通信方法,使得应用…

Java算法之时间复杂度和空间复杂度的概念和计算

1. 算法效率 如何去衡量一个算法的好坏? 通常我们从时间效率和空间效率两个方面去分析算法的好坏。时间效率即时间复杂度,空间效率被称为空间复杂度。时间复杂度主要是衡量一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间…

基于springboot的服装生产管理系统源码数据库

基于springboot的服装生产管理系统源码数据库 摘 要 本协力服装厂服装生产管理系统设计目标是实现协力服装厂服装生产的信息化管理,提高管理效率,使得协力服装厂服装生产管理作规范化、科学化、高效化。 本文重点阐述了协力服装厂服装生产管理系统的…

有道词典网页版接口分析与爬虫研究

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 一、目标站点 有道词典网页版:网易有道 二、目标接口 url:https://dict.youdao.com/jsonapi_s?doctypejson&…

Linux系统搭建FastDFS文件服务结合内网穿透实现公网访问本地文件

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C++-基础

C语言介绍 C 是一种通用编程语言,具有高性能、灵活性和广泛的应用领域。它是在 1979 年由 Bjarne Stroustrup 开发的,最初被称为“C with Classes”,随后在 1983 年正式更名为 C。C 基于 C 语言,同时引入了面向对象编程&#xff0…

使用冒泡排序模拟实现qsort函数

目录 冒泡排序qsort函数的使用1.使用qsort函数排序整型数据2.使用qsort函数排序结构数据 冒泡排序模拟实现qsort函数今日题目1. 字符串旋转结果2.杨氏矩阵3.猜凶手4.杨辉三角 总结 冒泡排序 冒泡排序的核心思想是:两两相邻的元素进行比较 代码如下: //⽅法1 void bubble_so…

【Linux】线程的控制

目录 POSIX线程库 常用的POSIX线程库接口声明: 注意事项 创建一个进程 pthread_create函数 参数 返回值 使用示例 线程ID和进程地址空间布局 线程ID 进程地址空间布局 示例图 获取一个进程的线程ID 函数原型 返回值 使用示例 注意事项 线程终止 p…

2023年新科技与互联网全球化回顾:AIGC引领生产力变革与出海新趋势

随着海外网络基础设施的不断完善与发展,2023年,新技术和互联网全球化展现出前所未有的活力。尤其是AIGC技术的兴起,引领了生产力的深刻变革,同时也在全球范围内催生了新的出海趋势。 一、AIGC技术引领生产力变革 AIGC技术的快速发展,不仅提升了内容生产的效率,也降低了…

设计模式系列:责任链模式

简介 责任链模式是一种行为型设计模式,它允许你将请求沿着处理者链进行发送。每个处理者都可以对请求进行处理,或者将其传递给链上的下一个处理者。责任链模式主要应用于面向对象编程中,特别是当系统中的对象需要根据其属性来决定如何处理请…

嘴尚绝美味健康:探索美食背后的健康密码

在快节奏的现代生活中,人们对美食的追求从未停止。然而,随着健康意识的提升,越来越多的人开始关注美食与健康的平衡。今天,我们就来一起探讨“嘴尚绝美味健康”这一话题,看看如何在享受美食的同时,保持身体…

JMeter入门教程 —— 事务!

简介: JMeter中事务的基本介绍 1.任务背景 JMeter中的事务是通过事务控制器实现的。,为了衡量服务器对某一个或一系列操作处理的响应时间,需要定义事务。下面我们详细介绍在JMeter中如何使用事务 2.任务目标 掌握基于JMeter性能测试脚本开…

speccpu2017安装与使用

国产化桌面下Speccpu2017安装与使用 1、 安装依赖库 安装speccpu2017前需要安装依赖包,通过终端命令对依赖包进行安装 sudo apt-get install gcc g gfortran (以上是已经安装好的) 注:若安装不上,需替换/etc/apt下的s…

Docker部署SpringBoot服务(Jar包映射部署)

介绍 项目在docker部署运行以后,每次需更新jar包时,都得重新制作镜像,再重新制作容器。流程及其繁琐,效率极低。 以下步骤是在不更新镜像和容器的前提下,直接更新jar完成项目更新的操作。 不更新镜像 1. 创建你存放…

TypeScript17:静态成员

一、什么是静态成员 静态成员是指,附着在类上的成员(属于某个构造函数的成员) class User {constructor(public loginId: string,public loginPwd: string,public name: string,public age: number) { }static login(loginId: string,loginPw…

matlab p文件解密 p文件转m文件

matlab p文件解密 将p文件转m文件 收费:1元/个p文件,多个文件优惠; 不成功不收费 qq联系 3338714180 注: MATLAB 的p 文件通常是 MATLAB 的函数m文件,但是经过编译后变成了 p 文件,使其无法直接查看或…

几款高效在线文档编辑器推荐,编辑文档更轻松

在数字化时代,文档编辑工作变得越来越重要。无论是工作报告、学习笔记还是创意文稿,一个优秀的在线文档编辑器都能让你的工作事半功倍。现在市面上也有很多优秀的在线文档编辑器,比如WPS Office、腾讯文档、 Microsoft Word Online。今天&…

openGauss_5.0.1 企业版安装及问题记录(CentOS系统):主备模式服务器安装

目录 📚第一章 官方地址📗安装包下载地址📗文档指南 📚第二章 安装📗准备工作📗开始安装📕创建XML配置文件📕初始化安装环境📕执行安装📕验证 📚第…