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

网站做程序员/优化seo深圳

网站做程序员,优化seo深圳,设计公司首页,做网站现在什么尺寸合适1、浅谈this 1.1、调用位置 在学习this的绑定过程之前,首先要理解调用位置,即函数在代码中被调用的位置,因此我们需要分析调用栈,看以下代码 function baz(){// 当前调用栈是baz// 因此调用位置就是全局作用域console。log(&qu…

1、浅谈this

1.1、调用位置

在学习this的绑定过程之前,首先要理解调用位置,即函数在代码中被调用的位置,因此我们需要分析调用栈,看以下代码

function baz(){// 当前调用栈是baz// 因此调用位置就是全局作用域console。log("baz");bar(); // <-- bar的调用位置
}
function bar(){// 当前调用栈是 baz --> bar// 因此,当前调用位置在baz中console.log("bar")foo(); // <-- foo的调用位置
}
function foo(){// 当前调用栈是 baz -> bar -> foo// 因此当前的调用位置在bar中console.log("foo")
}
baz() // <-- baz的调用位置

2、绑定规则

在函数执行过程中调用位置决定this绑定对象有四条规则

2.1、默认绑定

最常见的函数调用类型是独立函数调用,可以把这条规则看作是无法应用其他规则时的默认规则

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

当调用foo()时,this.a解析成了全局变量a,这是因为函数调用时应用了this的默认绑定,因此this指向全局对象

2.2、隐式绑定

我们必须在一个对象内部包含一个指向函数的属性,并通过这个属性间接引用引用函数,从而把this间接(隐式)绑定到这个对象上

该绑定方式需要考虑调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含,不过这种说法可能会造成一些误导,看以下代码

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

无论你如何称呼这个模式,当 foo()被调用时,它的前面确实加上了对obj的引用。当函数引用有上下文对象时,隐式绑定规则会把函数调用中的 this 定到这个上下文对象。因为调用 foo()时 this 被绑定到 obj,因此 this.a和obj.a是一样的。

对象属性引用链中只有上一层或者说最后一层在调用位置中起作用,举例来说

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

但是隐式绑定会出现绑定丢失的问题

2.3、显式绑定

隐式绑定需要我们在一个对象内部包含一个指向函数的属性,并通过这个属性间接引用引用函数,从而把this间接(隐式)绑定到这个对象上,如果我们不想这样做,而想在某个对象上强制调用函数,应该怎么做?我们可以使用call(…)和apply(…)方法,这两个方法的第一个参数都是一个对象,是给this准备的,接着在调用函数时将其绑定到this,因为可以直接指定this的绑定对象,因此我们称之为显式绑定

简单的例子:

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

通过foo.call(…),我们可以在调用foo时强制把他的this绑定到obj上

如果传入了一个原始值(字符串、数组、数字)来当做this的绑定对象,这个原始值会被转换成它的对象形式(也就是new String(…)、new Boolean(…)、new Number(…)),这通常被称为“装箱”

如果想要解决绑定丢失问题,我们可以使用显式绑定的一个变种 — 硬绑定

function foo() {console.log(this.a);}var obj = {a: 2}var bar = function () {foo.call(obj)}bar() // 2setTimeout(bar, 100) // 2// 硬绑定的bar不可能在修改它的thisbar.call(window) // 2

我们创建了函数 bar(),并在它的内部手动调用了foo.call(obj),因此强制把 foo的 this 绑定到了obj。无论之后如何调用函数bar,它总会手动在 obj上调用 foo。这种绑定是一种显式的强制绑定,因此我们称之为硬绑定

由于硬绑定是一种非常常用的模式,所以ES5提供了内置的方法Function.prototype.bind

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

bind(…)会返回一个硬编码的新函数,会把所指定的参数设置为this的上下文并调用原始函数

2.4、new绑定

在传统的面向类的语言中,“构造函数”是类中的一些特殊方法,使用new初始化类时会调用类中的构造函数。在JS中也有一个new操作符,但JS中的new的机制实际上和面向类的语言完全不同

在JS中,构造函数之所以写使用new操作符时被调用的函数。它们并不属于某个类,也不会实例化一个类,实际上,他们只是被new操作符调用的普通函数而已

使用new来调用函数,或者说发生构造函数调用时,会执行下边的操作(也是new操作符的实现原理)

  1. 创建一个全新的对象
  2. 这个新对象会执行prototype连接
  3. 这个新对象会绑定到函数调用的this
  4. 如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象
function foo(a){this.a = a
}
var bar = new foo(2)
console.log(bar.a) // 2

使用new调用foo(…)时,会构建一个新对象并把它绑定到foo(…)调用中的this上。new是最后一种可以影响调用时this绑定行为的方法,称之为new绑定

3、绑定优先级

总得来说优先级如下:new > 显式绑定 > 隐式绑定 > 默认绑定

  1. 函数是否在 new 中调用 (new 绑定)? 如果是的话 this 定的是新创建的对象

    var bar = new foo()
    
  2. 函数是否通过 callapply (显式绑定)或者硬绑定调用?如果是的话,this 绑定的是指定的对象。

    var bar = foo.call(obj2)
    
  3. 函数是否在某个上下文对象中调用 (隐式绑定)?如果是的话,this 定的是那个上下文对象。

    var bar = obj1.foo()
    
  4. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到undefined,否则绑定到全局对象。

    var bar = foo()
    

大部分就是上述四种情况所述,但是凡事都有例外

4、绑定例外

在某些情况下this的绑定会出乎意料,当我们认为应当使用前三种规则时,但实际上使用的可能是默认绑定规则

4.1、被忽略的this

如果我们把null或者underfined作为this的绑定对象传入call、apply或bind,这些值在调用时会被忽略,实际上应用的是默认绑定规则

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

那么在什么情况下我们会传入null呢?

一种常见的做法是使用apply(…)来“展开”一个数组,并当作参数传人一个函数。类似地,bind(…)可以对参数进行柯里化 (预先设置一些参数),这种方法有时非常有用

function foo(a, b) {console.log("a:" + a + ", b:" + b);
}
// 把数组“展开”成参数
foo.apply(null, [2, 3]); // a:2, b:3
// 使用 bind(..)进行柯里化
var bar = foo.bind(null, 2); 
bar(3); // a:2,b:3

这两种方法都需要传人一个参数当作 this 的绑定对象。如果函数并不关心 this 的话,你仍然需要传人一个占位值,这时 null 可能是一个不错的选择,就像代码所示的那样

然而,总是使用null来忽略 this 绑定可能产生一些副作用。如果某个函数确实使用了this (比如第三方库中的一个函数),那默认绑定规则会把 this 定到全局对象 (在浏览器中这个对象是 window),这将导致不可预计的后果 (比如修改全局对象)。

一种“更安全”的做法是传入一个特殊的对象,把 this 绑定到这个对象不会对你的程序产生任何副作用。就像网络(以及军队)一样,我们可以创建一个“DMZ”(demilitarizedzone,非军事区)对象它就是一个空的非委托的对象
如果我们在忽略 this 绑定时总是传入一个 DMZ 对象,那就什么都不用担心了,因为任何对于 this 的使用都会被限制在这个空对象中,不会对全局对象产生任何影响。
在 JavaScript 中创建一个空对象最简单的方法都是 object.create(null)。object.create(null)和{}很像,但是并不会创建 object.prototype 这个委托,所以它比{}“更空”:

function foo(a, b) {console.log("a:" + a + ", b:" + b);
}
// 我们的 DMZ 空对象
var ø = Object.create(null);
// 把数组展开成参数
foo.apply(ø, [2, 3]); // a:2, b:3
// 使用 bind(..) 进行柯里化
var bar = foo.bind(ø, 2);
bar(3); // a:2, b:3

使用变量名 ø 不仅让函数变得更加“安全”,而且可以提高代码的可读性,因为 ø 表示“我希望 this 是空”,这比 null 的含义更清楚。

4.2、间接引用

另一个需要注意的是,你有可能(有意或者无意地)创建一个函数的“间接引用”,在这种情况下,调用这个函数会应用默认绑定规则。

间接引用最容易在赋值时发生:

function foo() {console.log(this.a);
}
var a = 2;
var o = { a: 3, foo: foo };
var p = { a: 4 };
o.foo(); // 3
(p.foo = o.foo)(); // 2

赋值表达式 p.foo = o.foo 的返回值是目标函数的引用,因此调用位置是 foo() 而不是p.foo() 或者 o.foo()。根据我们之前说过的,这里会应用默认绑定。
注意:对于默认绑定来说,决定 this 绑定对象的并不是调用位置是否处于严格模式,而是函数体是否处于严格模式。如果函数体处于严格模式,this 会被绑定到 undefined,否则this 会被绑定到全局对象。

4.3、软绑定

之前我们已经看到过,硬绑定这种方式可以把 this 强制绑定到指定的对象(除了使用 new时),防止函数调用应用默认绑定规则。问题在于,硬绑定会大大降低函数的灵活性,使用硬绑定之后就无法使用隐式绑定或者显式绑定来修改 this。
如果可以给默认绑定指定一个全局对象和 undefined 以外的值,那就可以实现和硬绑定相同的效果,同时保留隐式绑定或者显式绑定修改 this 的能力。可以通过一种被称为软绑定的方法来实现我们想要的效果:

if (!Function.prototype.softBind) {Function.prototype.softBind = function (obj) {var fn = this;// 捕获所有 curried 参数var curried = [].slice.call(arguments, 1);var bound = function () {return fn.apply((!this || this === (window || global)) ?obj : this,curried.concat.apply(curried, arguments));};bound.prototype = Object.create(fn.prototype);return bound;};
}

除了软绑定之外,softBind(…) 的其他原理和 ES5 内置的 bind(…) 类似。它会对指定的函数进行封装,首先检查调用时的 this,如果 this 绑定到全局对象或者 undefined,那就把指定的默认对象 obj 绑定到 this,否则不会修改 this。此外,这段代码还支持可选的柯里化

4.4、箭头函数中的this

箭头函数不使用 this 的四种标准规则,而是根据外层(函数或者全局)作用域来决定 this。

function foo() {// 返回一个箭头函数return (a) => {//this 继承自 foo()console.log(this.a);};
}
var obj1 = {a: 2
};
var obj2 = {a: 3
};
var bar = foo.call(obj1);
bar.call(obj2); // 2, 不是 3 !

foo() 内部创建的箭头函数会捕获调用时 foo() 的 this。由于 foo() 的 this 绑定到 obj1,bar(引用箭头函数)的 this 也会绑定到 obj1,箭头函数的绑定无法被修改。(new 也不行!)

箭头函数可以像 bind(…) 一样确保函数的 this 被绑定到指定对象,此外,其重要性还体现在它用更常见的词法作用域取代了传统的 this 机制。实际上,在 ES6 之前我们就已经在使用一种几乎和箭头函数完全一样的模式。

function foo() {var self = this; // lexical capture of thissetTimeout(function () {console.log(self.a);}, 100);
}
var obj = {a: 2
};
foo.call(obj); // 2

虽然 self = this 和箭头函数看起来都可以取代 bind(…),但是从本质上来说,它们想替代的是 this 机制。

5、总结

如果要判断一个运行中函数的 this 绑定,就需要找到这个函数的直接调用位置。找到之后就可以顺序应用下面这四条规则来判断 this 的绑定对象。

  1. 由 new 调用?绑定到新创建的对象。
  2. 由 call 或者 apply(或者 bind)调用?绑定到指定的对象。
  3. 由上下文对象调用?绑定到那个上下文对象。
  4. 默认:在严格模式下绑定到 undefined,否则绑定到全局对象。

一定要注意,有些调用可能在无意中使用默认绑定规则。如果想“更安全”地忽略 this 绑定,你可以使用一个 DMZ 对象,比如 ø = Object.create(null),以保护全局对象。ES6 中的箭头函数并不会使用四条标准的绑定规则,而是根据当前的词法作用域来决定this,具体来说,箭头函数会继承外层函数调用的 this 绑定(无论 this 绑定到什么)。这其实和 ES6 之前代码中的 self = this 机制一样。

相关文章:

深入理解JS中的this

1、浅谈this 1.1、调用位置 在学习this的绑定过程之前&#xff0c;首先要理解调用位置&#xff0c;即函数在代码中被调用的位置&#xff0c;因此我们需要分析调用栈&#xff0c;看以下代码 function baz(){// 当前调用栈是baz// 因此调用位置就是全局作用域console。log(&qu…...

rust 基础数据类型

默认类型 大部分情况下&#xff0c;rust 可以基于上下文自动推导出变量的类型。下面代码中&#xff0c;变量 x 没有显式&#xff0c;rust 默认是 i32 类型。 fn main() {let x 5; }但也有一些例外情况&#xff0c;比如&#xff0c;字符串类型的转换中变量 x 的类型&#xff…...

ELK极简上手

目录 引言 首先&#xff0c;下载相关的包 其次&#xff0c;安装启动elasticsearch 下一步&#xff0c;安装并启动logstash 最后&#xff0c;安装并启动kibana 进一步的&#xff0c;测试数据的流动 引言 最近整理电脑发现之前的一篇ELK极简入门笔记&#xff0c;现整理发出…...

在 JavaScript 中,变量的作用域是如何确定的?

在 JavaScript 中&#xff0c;变量的作用域是由作用域链&#xff08;Scope Chain&#xff09;来确定的。作用域链是指变量在执行期间访问的作用域的链式结构。 JavaScript 中的作用域分为全局作用域和局部作用域&#xff08;函数作用域和块级作用域&#xff09;。 全局作用域…...

常见面试题-TCP三次握手四次挥手

TCP 三次握手/四次挥手 参数用途SYN用于启动和建立连接时&#xff0c;同步设备之间的序列号。0到2^32 - 1的随机数。ACK向另一端确认已经收到 SYN&#xff0c;数值为收到 SYN 增一。SYN-ACK确认之前收到了 SYN&#xff0c;数值为自定义值。FIN终止连接。RST重置连接。 三次握…...

前端框架Vue学习 ——(六)Vue组件库Element

文章目录 Element 介绍快速入门常见组件表格分页Dialog 对话框组件表单 Container 布局容器 Element 介绍 Element&#xff1a;是饿了么团队研发的&#xff0c;一套为开发者、 设计师和产品经理准备的基于Vue 2.0的桌面端组件库。 组件&#xff1a;组成网页的部件&#xff0c;…...

第六章:Property-based Testing and Test Oracles

文章目录 Test OraclesActive and Passive Test OraclesTypes of Test OraclesFormal, executable specificationsSolved examplesMetamorphic oraclesAlternative implementations (备用实现)Heuristic oracles (启发式)The Golden Program!Oracle Deviation (Oracle偏差)T…...

react生命周期函数

React 组件的生命周期可分为三大阶段&#xff1a;挂载阶段&#xff08;Mounting&#xff09;、更新阶段&#xff08;Updating&#xff09;和卸载阶段&#xff08;Unmounting&#xff09;。 1.挂载阶段&#xff08;Mounting&#xff09; 在组件被插入到 DOM 中后&#xff0c;会…...

QSqlDatabase使用Sqlite

QSqlDatabase使用Sqlite Sqlite本身就可以被内嵌在程序中&#xff0c;QSqlDatabase也自带Sqlite驱动&#xff0c;无需任何第三方依赖&#xff0c;可以直接使用 QSqlDatabase _db QSqlDatabase::addDatabase("QSQLITE"); QString dbPath "/path/to/xxx.db&qu…...

宝马——使用人工智能制造和驾驶汽车

德国汽车制造商宝马(BMW)每年在全球制造和销售250万台汽车&#xff0c;其品牌包括宝马、MINI和劳斯莱斯。 宝马汽车以其卓越的性能和对新技术的应用而著名&#xff0c;它是道路上最精致的汽车之一&#xff0c;并且和其竞争对手戴姆勒(Daimler)一样&#xff0c;在将自动驾驶汽车…...

java入门,Map<? extends String, ?>

一、前言 是不是平时写业务代码的时候很少用到这个写法&#xff1a;Map<? extends String, ?>&#xff0c;这是Map类型&#xff0c;Map的键是? extends String 类型&#xff0c;值是?。为什么不是我们平时写的Map< String, Object>&#xff0c;这种写法有什么好…...

Spring Boot 统一处理功能

目录 1.用户登陆权限验证 1.1 每个方法验证 1.2 Spring AOP 用户统一登陆验证 1.3 拦截器 1.3.1 自定义拦截器 1.3.2 将自定义拦截器配置到系统设置中&#xff0c;并且设置拦截规则 1.3.3 排除所有的静态资源 1.4 登录拦截器&#xff08;练习&#xff09; 1.5 拦截器原…...

香港金融科技周VERTU CSO Sophie谈Web3.0的下一个风口 手机虚拟货币移动支付

10月31日&#xff0c;香港金融科技周正式拉开帷幕。这项香港金融科技界地年度盛事今年已经踏入了第八届&#xff0c;本届活动吸引超过数百位金融科技专业人士、创业者和行业领袖现场参与&#xff0c;线上参与观众超过10万人次。 在金融科技周的圆桌会议上&#xff0c;VERTU首席…...

分布式单元化

一 分布式单元化 1.1 两地三中心 顾名思义&#xff0c;两地指的是两个城市&#xff1a;同城&#xff0c;异地。三中心指的是三个数据中心&#xff1a;生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统&#xff0c;双中心具备相当的业…...

wvp-gb28181-pro接入海康摄像头

网络-高级配置-平台接入 sip服务器信息默认参数如下&#xff0c;一键安装wvp完成之后默认就是这样的参数 设置项 设置值 平台接入方式 28181 本地sip端口 5060 传输协议 tcp、udp&#xff08;外网的话我建议还是用tcp&#xff09; 启用 勾选 协议版本 GB/T28181-201…...

近视眼选择什么台灯好?专家推荐的防近视台灯

年轻的时候不懂&#xff0c;以为自己的眼睛不好&#xff0c;近视度数高&#xff0c;是因为长时间看书造成的&#xff0c;其实我们都忽视了一个最为重要的影响因素&#xff0c;那就是灯光。如今的孩子面临着比我们以前更要繁重的学习压力&#xff0c;因此更需要注意用眼健康了&a…...

数据标注工具【LabelImg】安装使用 用VOC制作自己的数据集

labelImg的安装 ⭐️LabelImg简介⭐️LabelImg的安装⭐️labelImg标注数据集⭐️利用VOC制作自己的数据集 ⭐️LabelImg简介 Labelimg是一款开源的数据标注工具&#xff0c;标签可用于分类和目标检测&#xff0c;它是用python写的&#xff0c;并使用Qt作为其图形界面&#xf…...

Zeus IoT : 基于 SpringBoot 的分布式开源物联网大数据平台

Zeus IoT 是一个集设备数据采集、存储、分析、观测为一体的开源物联网平台&#xff0c;全球首创基于 Zabbix 的物联网分布式数据采集架构&#xff0c;具备超百万级物联网设备的并发监控能力&#xff0c;真正具备工业级性能与稳定性的开源物联网大数据中台。 Zeus IoT 致力于让设…...

面试—如何介绍项目中的多级缓存?

项目中使用的多级缓存也就是 分布式缓存 Redis 本地缓存 Caffeine&#xff0c;那么令 Caffeine 作为一级缓存&#xff0c;Redis 作为二级缓存&#xff0c;在项目中通过记录数据的访问次数&#xff0c;将热点数据放在 本地缓存&#xff0c;将非热点数据放在 Redis缓存 中&#…...

PyTorch入门学习(十七):完整的模型训练套路

目录 一、构建神经网络 二、数据准备 三、损失函数和优化器 四、训练模型 五、保存模型 一、构建神经网络 首先&#xff0c;需要构建一个神经网络模型。在示例代码中&#xff0c;构建了一个名为Tudui的卷积神经网络&#xff08;CNN&#xff09;模型。这个模型包括卷积层、…...

《 Hello 算法 》 - 免费开源的数据结构与算法入门教程电子书,包含大量动画、图解,通俗易懂

这本学习算法的电子书应该是我看过这方面最好的书了&#xff0c;代码例子有多种编程语言&#xff0c;JavaScript 也支持。 《 Hello 算法 》&#xff0c;英文名称是 Hello algo&#xff0c;是一本关于编程中数据解构和算法入门的电子书&#xff0c;作者是毕业于上海交通大学的…...

数据库之事务

数据库之事务 事务的特点&#xff1a; ACID 原子性 一致性&#xff1a;数据库的完整性约束&#xff0c;不能被破坏 隔离性 持久性&#xff1a;数据一旦提交&#xff0c;事务的效果将会被永久的保留在数据库中。而且不会被回滚 主从复制 高可用 备份 权限控制 脏读&am…...

NOIP2023模拟12联测33 B. 游戏

NOIP2023模拟12联测33 B. 游戏 文章目录 NOIP2023模拟12联测33 B. 游戏题目大意思路code 题目大意 期望题 思路 二分答案 m i d mid mid &#xff0c;我们只关注学生是否能够使得被抓的人数 ≤ m i d \le mid ≤mid 那我们就只关心 a > m i d a > mid a>mid 的房…...

代码随想录打卡第六十三天|84.柱状图中最大的矩形

84.柱状图中最大的矩形 题目&#xff1a;给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 提示&#xff1a; 1 < heights.length <105 0 < h…...

python tempfile 模块使用

在Python中&#xff0c;tempfile 模块用于创建临时文件和目录&#xff0c;它们可以用于存储中间处理数据&#xff0c;不需要长期保存。该模块提供了几种不同的类和函数来创建临时文件和目录。 下面是几个常用的 tempfile 使用方法&#xff1a; 临时文件 使用 NamedTemporary…...

【软件测试】接口测试实战详解

最近找到了几个问题&#xff0c;都还比较有代表性。 作为一个初级测试&#xff0c;想学接口测试&#xff0c;但是一点头绪都没有。求教大神指点&#xff0c;有没有好的书或者工具推荐&#xff1f;如何做接口测试呢&#xff1f;接口测试有哪些工具做接口测试的流程一般是怎么样…...

轻量封装WebGPU渲染系统示例<20>- 美化一下元胞自动机之生命游戏(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifePretty.ts 系统特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据(内外部相关资源)和渲染机制分离…...

Nodejs的安装以及配置(node-v12.16.1-x64.msi)

Nodejs的安装以及配置 1、安装 node-v12.16.1-x64.msi点击安装&#xff0c;注意以下步骤 本文设置nodejs的安装的路径&#xff1a;D:\soft\nodejs 继续点击next&#xff0c;选中Add to PATH &#xff0c;旁边的英文告诉我们会把 环境变量 给我们配置好 当然也可以只选择 Nod…...

03【保姆级】-GO语言变量和数据类型和相互转换

03【保姆级】-GO语言变量和数据类型 一、变量1.1 变量的定义&#xff1a;1.2 变量的声明、初始化、赋值1.3 变量使用的注意事项 插播-关于fmt.Printf格式打印%的作用二、 变量的数据类型2.1整数的基本类型2.1.1 有符号类型 int8/16/32/642.1.2 无符号类型 int8/16/32/642.1.3 整…...

mermaid学习第一天/更改主题颜色和边框颜色/《需求解释流程图》

mermaid 在线官网&#xff1a; https://mermaid-js.github.io/ 在线学习文件&#xff1a; https://mermaid.js.org/syntax/quadrantChart.html 1、今天主要是想做需求解释的流程图&#xff0c;又不想自己画&#xff0c;就用了&#xff0c;框框不能直接进行全局配置&#xff0…...