当前位置: 首页 > news >正文

【阅读笔记】你不知道的JavaScript--this与对象2

目录

      • this
        • 默认绑定
        • 隐式绑定
        • 隐式丢失
        • 显示绑定
        • API 调用上下文
        • new 绑定
        • this 绑定优先级
        • 其余绑定例外
      • 对象
        • 字面量与对象
        • 属性描述符
        • 迭代器遍历

this


默认绑定

默认绑定适配 独立函数调用
默认绑定 this 指向全局对象;
故直接调用函数,该函数内部的 this 即指向全局对象;

以上情况针对的是非严格模式下,而严格模式下的 this 默认绑定为 undefined

function foo() {console.log(this.a);
}
var a = 2;
foo(); // 2

隐式绑定

隐式绑定格式: xxx.func() 或者 xxx.xxx.func()
无论 func()前面有多少个对象,func 的 this 指向永远是离他最近的一个对象
譬如下方代码, obj1.obj2.foo() 中 foo()的 this 就指向 obj2

function foo() {}
var obj2 = {a: 42,foo: foo,
};
var obj1 = {a: 2,obj2: obj2,
};
obj1.obj2.foo(); // 42

隐式丢失

使用函数别名套娃太多次就会造成隐式丢失现象!
如下方代码,bar 中的 foo 是直接使用了函数别名,而不是调用 foo()
最终我们使用 bar()造成了隐式丢失,在非严格模式下取得了全局对象;

可以这么理解
bar()相当于 (obj.foo)() 而不是我们想象的 obj.foo(),故前者遵照我们的默认绑定原则,必然会指向全局对象了!

function foo() {}
var obj = {a: 2,foo: foo,
};
var bar = obj.foo;
var a = 100;
bar(); // 100

显示绑定

即使用 call apply bind 进行绑定,人为指定上下文 this
如下方代码,对 foo.call 人为将 this 指向对象 obj,故调用函数 foo 后,是出结果为 2

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

硬绑定:即一旦对一个对象使用 call 或者其他函数绑定后,无论后续怎么修改都不会改变原来绑定的对象;
apply 和 call 作用一致,好好看代码,理清逻辑关系!!!

function foo(sth) {console.log(this.a + sth);return this.a + sth;
}
var obj = {a: 2,
};
var bar = function () {return foo.apply(obj, arguments);
};
var b = bar(3); //2 3
console.log(b); //5

API 调用上下文

一个很抽象的例子,使用了结构赋值的方法

function foo(el) {console.log(el, this.id);
}
var obj = {id: "hello",
};
[(1, 2, 3)].forEach(foo, obj); // 1hello 2hello 3hello

new 绑定

经典面试题:当我们使用 new 时,发生了什么?

  1. 创建(或者说构造)一个全新的对象。
  2. 这个新对象会被执行 [[Prototype]] 连接。
  3. 这个新对象会绑定到函数调用的 this。
  4. 如果函数没有返回其他对象,那么 new 表达式中的函数调用会自动返回这个新对象。

下面就是一个很简单的构造函数例子;
构造函数内部使用 this 直接指向其内部的 constructor 存储区,那么后续调用 bar.a 的时候,就是取出 constructor 存储区的内容,而非原型对象的内容

function foo(a) {this.a = a;
}
var bar = new foo(2);
console.log(bar.a); // 2

this 绑定优先级

柯里化(currying) -> 参考 bind 硬绑定
指把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术

绑定优先级: 硬绑定 > new 绑定 > 隐式绑定 > 默认绑定


其余绑定例外

当你使用 call 进行绑定的时候传入的是一个 null 或者 undefined,那么就自动使用默认绑定规则替代;
foo.call(null)

DMZ 非军事化区;
即将 this 绑定到一个空的费委托对象 DMZ 上去,不会对程序产生任何影响

function foo(a, b) {console.log(a + b);
}
var dmz = Object.create(null);
foo.apply(dmz, [2, 3]);
var bar = foo.bind(dmz, 2);
bar(3); // 2 3

对象

字面量与对象

var 创建字面量而非对象,而仅有对象才可以使用诸如长度访问、文字操作等方法;
而引擎会自动把 var 声明的字面量自动转换成对象,而无需显式构造:

var str = "helloworld"; // 字面量
console.log(str.length);

俩特例:
null 和 undefined 没有对应的构造形式,它们只有文字形式;
Date 只有构造,没有文字形式;

现在有两个取对象中属性的写法:
obj['name'] 或者 obj[0]
事实上,引擎都会先把下标转换成字符串类型然后才取,且对象中的属性名最终都会变成字符串类型
故存在 obj[0]===obj['0']


属性描述符

ES5 新增,为对象内的所有属性都配备属性描述符,使用 getOwnPropertyDescriptor 获取它们

var obj = {a: 2,
};console.log(Object.getOwnPropertyDescriptor(obj, "a"));
// { value: 2, writable: true, enumerable: true, configurable: true }

或者使用 defineProperty 人工定义属性描述符

Object.defineProperty(obj, "a", {value: 10,writable: true,configurable: true,enumerable: true,
});

属性简介
writable 决定是否可以修改属性的值
Configurable 只要属性是可配置的
enumerable 属性可否被枚举


几个常用的属性描述符操作
Object.preventExtensions 禁用为对象添加新属性
Object.seal 对象不能添加属性,亦无法重新配置或删除任何属性
Object.freeze 在 seal 基础上设置 writable:false

Object.preventExtensions(obj);
Object.seal(obj);
Object.freeze(obj);

迭代器遍历

使用内置的 @@iterator 来遍历数组
ES6 中的符号 Symbol.iterator 来获取对象的 @@iterator 内部属性

var arr = [1, 2, 3];
var it = arr[Symbol.iterator]();it.next(); // {value:1,done:false}
it.next();

相关文章:

【阅读笔记】你不知道的JavaScript--this与对象2

目录this默认绑定隐式绑定隐式丢失显示绑定API 调用上下文new 绑定this 绑定优先级其余绑定例外对象字面量与对象属性描述符迭代器遍历this 默认绑定 默认绑定适配 独立函数调用 默认绑定 this 指向全局对象; 故直接调用函数,该函数内部的 this 即指向全…...

单板TVS接地不当造成辐射骚扰超标问题分析-EMC

【摘要】 某产品EMC辐射骚扰测试超标,通过近远场扫描配合定位分析,逐步找出骚扰源、传播路径,最终通过修改 PCB 走线切断传播路径解决此问题。 1 故障现象 某产品在进行 EMC 研发摸底测试时发现,整机辐射骚扰垂直方向测试超标&a…...

用Python Flask为女朋友做一个简单的网站(附可运行的源码)

🌟所属专栏:献给榕榕🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该专栏系为女友准备的,里面会不定时发一些讨好她的技术作品,感兴趣的小伙伴可以关注一下~👉文章简介…...

vue3+rust个人博客建站日记5-所有界面

没有数据的前端,是没有灵魂的。明明标题是vue3 rust ,但日记撰写至今,似乎只有第一篇提及了Rust,这可不行。是时候一股作气,完成大部分页面绘制工作了! 最后再说一次,时间要加速了。 ——普奇神…...

青少年软件编程C++一级真题(202212)

1、输入一个整数x&#xff0c;输出这个整数加1后的值&#xff0c;即x1的值。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 一个整数x&#xff08;0 ≤ x ≤ 1000&#xff09;。 输出 按题目要求输出一个整数。 样例输入 9样例输出 10 #include<iost…...

【Spring】AOP底层原理(动态代理)-》 AOP概念及术语 -》 AOP实现

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ AOP - 面向切面编程一、简述AOP二、AOP底层原理…...

Java8 新特性 之 lambda 表达 和 函数式接口

—— lambda 表达式 概念 lambda 表达式是一个匿名函数&#xff0c;可以把 lambda 表达式理解为是一段可以传递的代码。更简洁、更灵活&#xff0c;使 Java 的语言表达能力得到了提升lambda 表达式是作为接口的实现类的对象&#xff08;万事万物皆对象&#xff09; 使用语法…...

Netty服务端和客户端开发实例

一、Netty服务端开发在开始使用 Netty 开发 TimeServer 之前&#xff0c;先回顾一下使用 NIO 进行服务端开发的步骤。(1)创建ServerSocketChannel&#xff0c;配置它为非阻塞模式;(2)绑定监听&#xff0c;配置TCP 参数&#xff0c;例如 backlog 大小;(3)创建一个独立的I/O线程&…...

linux基本指令和权限

目录 一.shell命令以及运行原理 二.Linux常用指令 1. ls 指令 2. pwd命令 3.cd指令 4. touch指令 5.mkdir指令&#xff08;重要&#xff09; 6.rmdir指令 && rm 指令&#xff08;重要&#xff09; 7.man指令&#xff08;重要&#xff09; 8.cp指令&#xff08;重要&…...

滚蛋吧,正则表达式!

大家好&#xff0c;我是良许。 不知道大家有没有被正则表达式支配过的恐惧&#xff1f;看着一行火星文一样的表达式&#xff0c;虽然每一个字符都认识&#xff0c;但放在一起直接就让人蒙圈了~ 你是不是也有这样的操作&#xff0c;比如你需要使用「电子邮箱正则表达式」&…...

序列号和反序列化--java--Serializable接口--json序列化普通使用

序列化和反序列化序列化和反序列化作用为什么需要用途Serializable使用serialVersionUID不设置的后果什么时候修改Externalizable序列化的顺序json序列化序列化和反序列化 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过…...

Java异步任务编排

多线程创建的五种方式&#xff1a; 继承Thread类实现runnable接口。实现Callable接口 FutureTask(可以拿到返回结果&#xff0c;阻塞式等待。)线程池创建。 ExcutorService service Excutors.newFixedThreadPool(10); service.excute(new Runnable01());另外一种创建线程池…...

Hive与HBase的区别及应用场景

当数据量达到一定量级的时候&#xff0c;存储和统计计算查询都会遇到问题&#xff0c;今天了解一下Hive和Hbase的区别和应用场景。 一、定义 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供简单的sql查询功能&am…...

C++之单例模式

目录 1. 请设计一个类&#xff0c;只能在堆上创建对象 2. 请设计一个类&#xff0c;只能在栈上创建对象 3.请设计一个类&#xff0c;不能被拷贝 C98 C11 4. 请设计一个类&#xff0c;不能被继承 C98 C11 5. 请设计一个类&#xff0c;只能创建一个对象(单例模式) 设计…...

Redis十大类型——Set与Zset常见操作

Redis十大类型——Set与Zset常见操作Set命令操作简列基本操作展示删除移动剪切集合运算Zset基本操作简列添加展示反转按分数取值获取分数值删除分数操作下标操作如果我们对Java有所了解&#xff0c;相信大家很容易就明白Set&#xff0c;在Redis中也一样&#xff0c;Set的value值…...

车载雷达实战之Firmware内存优化

内存&#xff08;Memory&#xff09;是计算机中最重要的部件之一&#xff0c;计算机运时的程序以及数据都依赖它进行存储。内存主要分为随机存储器&#xff08;RAM&#xff09;,只读存储器&#xff08;ROM&#xff09;以及高速缓存&#xff08;Cache&#xff09;。仅仅雷达的原…...

【剑指Offer】JZ14--剪绳子

剪绳子详解1.问题描述2.解题思路3.具体实现1.问题描述 2.解题思路 首先想到的思路&#xff1a;因为是求乘积的最大值&#xff0c;所以如果截取剩下的是1&#xff0c;那还是它本身就没有意义。从此出发&#xff0c;考虑绳子长度是2、3、4、5…通过穷举法来找规律。 值–》拆分–…...

raspberry pi播放音视频

文章目录目的QMediaPlayerGStreamerwhat is GStreamer体系框架优势omxplayerwhat is omxplayercommand Linekey bindings运行过程中错误ALSA目的 实现在树莓派下外接扬声器&#xff0c; 播放某段音频&#xff0c; 进行回音测试。 QMediaPlayer 首先我的安装是5.11版本。 优先…...

【电子学会】2022年12月图形化二级 -- 老鹰捉小鸡

老鹰捉小鸡 小鸡正在农场上玩耍&#xff0c;突然从远处飞来一只老鹰&#xff0c;小鸡要快速回到鸡舍中&#xff0c;躲避老鹰的抓捕。 1. 准备工作 &#xff08;1&#xff09;删除默认白色背景&#xff0c;添加背景Farm&#xff1b; &#xff08;2&#xff09;删除默认角色小…...

C++的双端队列

双端队列介绍1.双端队列知识需知2.大试牛刀1.双端队列知识需知 由于队列是一种先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;因此无法直接从队列的底部删除元素。如果希望从队列的底部删除元素&#xff0c;可以考虑使用双端队列&#xff08;deque&#xff09;。…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

基于django+vue的健身房管理系统-vue

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…...

八、【ESP32开发全栈指南:UDP客户端】

1. 环境准备 安装ESP-IDF v4.4 (官方指南)确保Python 3.7 和Git已安装 2. 创建项目 idf.py create-project udp_client cd udp_client3. 完整优化代码 (main/main.c) #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h&…...

从0开始一篇文章学习Nginx

Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…...

C#调用Rust动态链接库DLL的案例

C#调用Rust动态链接库DLL的案例 项目概述 这是一个演示C#调用Rust动态链接库DLL的项目&#xff0c;包含&#xff1a; C#主程序 (Program.cs)Rust动态链接库 (rust_to_csharp目录) 使用C#创建一个net9的控制台项目&#xff0c;不使用顶级语句 dotnet new console --framewo…...

可视化图解算法48:有效括号序列

牛客网 面试笔试 TOP101 | LeetCode 20. 有效的括号 1. 题目 描述 给出一个仅包含字符(,),{,},[和],的字符串&#xff0c;判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭&#xff0c;"()"和"()[]{}"都是合法的括号序列&…...

在 Vue 的template中使用 Pug 的完整教程

在 Vue 的template中使用 Pug 的完整教程 引言 什么是 Pug&#xff1f; Pug&#xff08;原名 Jade&#xff09;是一种高效的网页模板引擎&#xff0c;通过缩进式语法和简洁的写法减少 HTML 的冗长代码。Pug 省略了尖括号和闭合标签&#xff0c;使用缩进定义结构&#xff0c;…...

【前端】vue3性能优化方案

以下是Vue 3性能优化的系统性方案&#xff0c;结合核心优化策略与实用技巧&#xff0c;覆盖渲染、响应式、加载、代码等多个维度&#xff1a; ⚙️ 一、渲染优化 精准控制渲染范围 v-if vs v-show&#xff1a; v-if&#xff1a;条件为假时销毁DOM&#xff0c;适合低频切换场景&…...

【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化

概述 RagflowPlus v0.4.0 在发布后&#xff0c;收到了积极的反馈&#xff0c;同时也包含一些问题。 本次进行一轮小版本更新&#xff0c;发布 v0.4.1 版本&#xff0c;对已知问题进行修复&#xff0c;并对部分功能进行进一步优化。 开源地址&#xff1a;https://github.com/…...

mysql-MySQL体系结构和存储引擎

1. MySQL体系结构和存储引擎 MySQL被设计成一个单进程多线程架构的数据库&#xff0c;MySQL数据库实例在系统上的表现就是一个进 程当启动实例时&#xff0c;读取配置文件&#xff0c;根据配置文件的参数来启动数据库实例&#xff1b;若没有&#xff0c;按编译时的默认 参数设…...