首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么使用和不使用"new“调用函数时,"this”的工作方式不同?

使用和不使用"new"调用函数时,"this"的工作方式不同的原因是因为在JavaScript中,"this"关键字的指向是动态的,它取决于函数的调用方式。

当使用"new"关键字调用函数时,会创建一个新的对象,并将该对象作为函数的上下文(也就是"this")来执行函数。这种方式被称为构造函数调用。在构造函数内部,可以使用"this"来引用新创建的对象,并将属性和方法添加到该对象上。

例如,假设有以下构造函数:

代码语言:txt
复制
function Person(name) {
  this.name = name;
}

var person = new Person("John");
console.log(person.name); // 输出 "John"

在上面的例子中,通过使用"new"关键字调用Person函数,创建了一个新的对象person,并将"name"属性添加到该对象上。

相反,当不使用"new"关键字调用函数时,函数的执行上下文(也就是"this")将取决于函数的调用位置。这种方式被称为普通函数调用。在普通函数调用中,"this"的默认指向是全局对象(在浏览器中是"window"对象)。

例如,考虑以下代码:

代码语言:txt
复制
function sayHello() {
  console.log(this);
}

sayHello(); // 输出全局对象(如window)

在上面的例子中,当使用普通函数调用方式调用sayHello函数时,"this"指向全局对象。

需要注意的是,使用"new"关键字调用函数时,函数内部的"this"指向新创建的对象;而不使用"new"关键字调用函数时,函数内部的"this"指向全局对象。这是因为"new"关键字会改变函数的执行上下文。

关于"this"的更多详细信息,可以参考腾讯云的文档:JavaScript中的this关键字

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Js 使用new关键字调用函数直接调用函数区别

,除了使用new操作符且把使用包装函数叫做构造函数之外,这个模式跟工厂模式是一模一样。...注意:构造函数返回值情况下,默认返回新对象实例。 看到这里,我就将上面的例子new关键字去掉,发现原来结果一样。...person.sayName(); 得出结论:使用new关键字是将函数当作构造函数调用,即为构造对象,若没有人为重写调用构造函数返回值,那么返回对象是由解析器自己生成。...不使用new关键字调用函数,即为普通函数调用。 随即想到若是函数返回值是function型呢?...),虽然new函数与直接调用函数产生结果等同,但是是两个不同过程,一个是构造对象、一个是函数调用

3.7K10

【JavaScript】对象 ③ ( 使用 new Object 创建对象 | 使用 构造函数 创建对象 | 构造函数语法 | 使用 字面量 new Object 创建对象方法弊端 )

创建对象方法弊端 在 JavaScript 中 , 使用 字面量 new Object 方式 创建对象 , 一次只能创建一个对象 , 而且需要写大量初始化代码 ; 如果要创建大量对象 ,...- 使用 " 构造函数 " 方式 创建对象 ; 2、构造函数引入 创建对象 , 属性方法结构都是相同 , 只是 属性值 不同 , 这里就可以通过 构造函数 只设置 不同 属性值 , 就可以...使用构造函数创建对象 var obj = new 构造函数名(); // 3. 调用对象属性 console.log(obj.属性名); // 4....使用 new 关键字调用构造函数,创建对象 var person = new Person('Tom', 18); 访问对象属性方法 : // 4....使用 new 关键字调用构造函数,创建对象 var person = new Person('Tom', 18); // 4.

12510
  • 为什么建议使用Date,而是使用Java8新时间日期API?

    Java 8:新时间日期API 在Java 8之前,所有关于时间日期API都存在各种使用方面的缺陷,因此建议使用时间日期API,分别从旧时间日期API缺点以及解决方法、Java 8...Date如果格式化,打印出日期可读性差。...当多个线程同时使用相同 SimpleDateFormat 对象【如用static修饰 SimpleDateFormat 】调用format方法,多个线程会同时调用 calendar.setTime...parse 方法实际调用 alb.establish(calendar).getTime() 方法来解析,alb.establish(calendar) 方法里主要完成了 重置日期对象cal属性值 使用... parse 方法地方进行加锁 => 线程阻塞性能差 使用 ThreadLocal 保证每个线程最多只创建一次 SimpleDateFormat 对象 => 较好方法 Java 8 新时间日期

    2K30

    Spark为什么只有在调用action才会触发任务执行呢(附算子优化使用示例)?

    微信图片_20200709201425.jpg但初学Spark的人往往都会有这样疑惑,为什么Spark任务只有在调用action算子时候,才会真正执行呢?...导致map执行完了要立即输出,数据也必然要落地(内存磁盘) 2. map任务生成、调度、执行,以及彼此之间rpc通信等等,当牵扯到大量任务、大数据量,会很影响性能 看到这两点是不是很容易联想到...:当输出结果输入结果不同时候可以被替换。...这里举一些常用transformationaction使用示例: transformation >> map map是对RDD中每个元素都执行一个指定函数来产生一个新RDD。...,排序。

    2.4K00

    Spark为什么只有在调用action才会触发任务执行呢(附算子优化使用示例)?

    但初学Spark的人往往都会有这样疑惑,为什么Spark任务只有在调用action算子时候,才会真正执行呢?咱们来假设一种情况:假如Spark中transformation直接触发Spark任务!...导致map执行完了要立即输出,数据也必然要落地(内存磁盘) 2. map任务生成、调度、执行,以及彼此之间rpc通信等等,当牵扯到大量任务、大数据量,会很影响性能 看到这两点是不是很容易联想到...,然后再在reduce端再次聚合,这点类似于MapReduce中combiner组件,可以减少磁盘IO网络IO,提高性能 3.aggregateByKey替代reduceByKey场景:当输出结果输入结果不同时候可以被替换...这里举一些常用transformationaction使用示例: transformation >> map map是对RDD中每个元素都执行一个指定函数来产生一个新RDD。...,排序。

    1.6K30

    箭头函数与普通函数(function)区别是什么?构造函数(function)可以使用 new 生成实例,那么箭头函数可以吗?为什么

    基本不同 1.写法不同,箭头函数使用箭头定义,普通函数中没有 .箭头函数都是匿名函数,普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。...在普通函数中,this总是指向调用对象,如果用作构造函数,this指向创建对象实例。箭头函数中没有this,声明时捕获其所在上下文this供自己使用。...所以箭头函数结合call(),apply()方法调用一个函数,只传入一个参数对this没有影响。...,不能使用new 关键字,因为new关键字是调用函数对象constructor属性,箭头函数中没有该属性,所以不能new function fn1(){ console.log...fn1() new fn2() 输出如下 image.png 5.箭头函数绑定arguments,取而代之用rest参数…解决 6.箭头函数不可做Generator函数

    1.9K10

    sshsftp为什么是同一端口_sshsftp使用不同端口

    sftp是基于ssh上实现,所以严格来说我们是无法来关闭ssh,而只是使用sftp。 ssh默认使用是22端口,当然这个端口是可以修改。...1.2 应用场景 局域网中有两批用户:一批用户:可以通过ssh登录上我们服务器 一批用户:可以使用sftp服务,但是我们希望这些能够能通过ssh登录上来 这种情况怎么处理: 我们可以将sftp用户单独分成一个组...,限制他们操作,这个可以利用RsshScponly或者实现。...但是如果提过sftp服务需要给另外一个局域网用户使用,这样我们虽然对这些用户做了限制,我们ssh服务还是开着,这样他人还是可以猜我们服务器用户名密码,通过ssh登录上来,最好方法是我们暴露出去服务根本无法通过...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    3.6K40

    nextline函数_在JAVA中Scanner中next()nextLine()为什么不能一起使用

    不是预期 “abc cba” “efg gfe” 2. nextLine 使用举例: 输入 1: 2 abc cba 结果 1: str[0] = “” str[1] = “abc” 原因:以回车...这个扫描器在扫描过程中判断停止依据就是“结束符”,空格,回车,tab 都算做是结束符 而坑点在于 next 系列,也就是下面这些函数:next nextInt nextDouble nextFloat...这些函数与 nextLine 连用都会有坑 坑点就是 next 系列函数返回了数据后,会把回车符留在缓冲区,因此我们下一次使用 nextLine 时候会碰到读取空字符串情况 解决方案:输入都用...nextLine ,做格式转换 输入 next 系列函数调用后,中间调用一次 nextLine 调用去掉了回车符后,再调用一次 nextLine 调用真正输入我们数据 都使用 nextLine: class...是为了循环输入功能,也就是 hasNext() 方法功能 今天忽然想到了可以用死循环来代替,所以,还是继续使用 BufferReader 吧!

    2.7K10

    使用C语言中头文件有什么技巧注意事项吗?为什么直接包含C文件呢?

    C语言头文件有什么用处 在平时项目开发过程中特别是几个项目组在一起工作时候,有的时候代码不是完全开放,这个时候头文件作用就体现出来了,在头文件中可以看到这个模块使用结构体,以及静态变量或者定义一些宏...,最主要看到这个模块使用函数列表,同时有些关键函数功能还会在头文件里面做出说明,通常在项目推进过程中就可以通过头文件调用库里面的函数,从而完成单元测试。...函数就是调用系统函数,通过引用 stdio.h ?...就可以使用printf函数打印东西了,有时候发现不带头文件有些系统函数也能被调用起来,主要C语言比较灵活,这种一般在编译时候会处警告,搞不影响编译通过,C语言编译通常来讲比较随意,所以在运行过程中可能出现崩溃现象...,很多初学者在玩头文件时候甚至要把所有的函数都搬上去了,显得非常没有层次感,而且只要在头文件声明函数都要标注上清晰注释,这样子在别人调用模块函数时候能够很轻松知道这个函数意思。

    1.7K30

    仙人指路,引而不发,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中NewMake函数使用背景区别EP16

    ,然后声明该类型指针,由于指针是引用类型,所以必须使用new函数为其分配内存,然后,才能对该引用结构体属性进行赋值。    ...这显然有些矛盾了,既然已经有了new函数,并且new函数可以为引用数据类型分配内存,而切片、字典通道也是引用类型吗?     大家既然都是引用类型,为什么直接使用new函数呢?...,并且设置好其对应基本数据类型零值,所以只要记住切片、字典通道声明后需要赋值时候,需要使用make函数为其先分配内存空间。    ...但为什么系统还要保留newmake函数呢?...结语     newmake函数都可以为引用类型分配内存,起到“仙人指路”作用,变量声明后“引而不发”就是使用它们时机,make函数作用于创建 slice、map channel 等内置数据结构

    25620

    Prototypal Inheritance with Javascript-JavaScript中原型继承(基础概念篇)

    因为JavaScript工作方式不同于传统面向对象语言。 在这篇文章中,我想阐述JavaScript面向对象实现,特别是JavaScript是如何实现继承。...因为JavaScript也是一个函数语言(函数是一等公民), 那么你也可以像下面的例子那样,使用函数创建对象: function myObject(){} var myObject = new myObject...同一个prototype object 可以被不同对象共享。不同对象可以共享同一个prototype object,因此这些不同对象 共享 同样方法属性。...//使用函数, 定义实例化了一个对象`Vehicle` function Vehicle() {} var vehicle = new Vehicle(); //为对象`Vehicle`添加属性。...Vehicle.call(this, name)所做是 “允许我们在调用函数,指定该函数执行上下文”。因此,这就是我们为什么传递this原因。

    44220

    Javac++构造函数区别是什么?

    Javac++都有构造函数,它们在Java中工作方式与在c++中工作方式相同。但是,他们名字是不一样。 例如,在Java中,必须使用new()操作符调用构造函数。...在创建对象没有其他方法显式地调用构造函数,但是在c++中,您可以在不使用新运算符情况下调用它。对于同时了解Javac++程序员来说,这也是一个很好面试问题。...因此,您将发现Java中泛型与c++中模板比较,这有助于快速理解这个概念。 ? Javac++构造函数区别是什么 正如我所说,c++Java都支持构造函数,但是调用它们方式不同。...没有new()操作符就不能调用Java构造函数。当您使用new()操作符,JVM会隐式地调用它们,但是您可以在c++中调用构造函数而不使用操作符。...您可以在c++中调用构造函数,而无需使用new关键字,这在Java中是不可能。因此,如果您是在c++背景下学习Java,请确保您总是在Java构造函数使用new关键字。

    1.5K40

    为什么vue3要选用proxy,好处是什么?

    提问Object.defineProperty()proxy区别?为什么vue3要选用proxy,好处是什么?...proxyProxy 对象用于创建一个对象代理,从而实现基本操作拦截自定义(如属性查找、赋值、枚举、函数调用等)。...这些方法仅在规范中使用,我们不能直接通过方法名调用它们。Proxy 捕捉器会拦截这些方法调用。它们在 proxy 规范 下表中被列出。...私有字段也上面一样3. peoxy != target这个很好理解 ,代理对象目标对象是=== 总结Proxy 是对象包装器,将代理上操作转发到对象,并可以选择捕获其中一些操作。...访问器属性get —— 一个没有参数函数,在读取属性工作,set —— 带有一个参数函数,当属性被设置时调用,enumerable —— 与数据属性相同,configurable —— 与数据属性相同

    57210

    为什么函数调用分支预测失败会影响计算性能?

    前言 我们经常会听到分支预测失败或者虚函数调用会影响计算性能,那么为什么它们会影响性能呢?带着这个疑问,我最近也看了一些博客论文,这里结合之前看一些点,整体做一个总结,大家一起学习。...虚函数核心理念就是通过基类访问派生类定义函数使用一个基类类型指针或者引用,来指向子类对象,进而调用由子类复写个性化函数,这是 C++ 实现多态性一个最经典场景。...因为 Object 类是所有类父类,如果 Java 中希望某个函数具有虚函数特性,可以加上final 关键字变成非虚函数。...这里先以汽车装配为例来解释流水线工作方式,假设装配一辆汽车分为四个步骤: 第一步冲压:制作车身外壳底盘等部件。 第二步焊接:将冲压成形后各部件焊接成车身。...为什么函数调用分支预测失败会降低 CPU 计算性能? 虚函数调用与普通函数调用区别在于: 普通函数是一次直接调用,直接调用跳转地址在编译是确定

    1.2K10

    .NET面试题解析(06)-GC与内存管理

    解释一下C#里析构函数为什么有些编程建议里推荐使用析构函数呢? 9. Finalize() Dispose() 之间区别? 10. DisposeFinalize方法在何时被调用?...一个变量如果在其生存期内某一刻已经不再被引用,那么,这个对象就有可能成为垃圾 4. GC是什么,简述一下GC工作方式?...using() 只是一种语法形式,其本质还是try…finally结构,可以保证Dispose始终会被执行。 8. 解释一下C#里析构函数为什么有些编程建议里推荐使用析构函数呢?...Finalize() Dispose()都是.NET中提供释放非托管资源方式,他们主要区别在于执行者执行时间不同: finalize由垃圾回收器调用;dispose由对象调用。...另外一个重点区别就是终结器会导致对象复活一次,也就说会被GC回收两次才最终完成回收工作,这也是有些人建议开发人员使用终结器主要原因。 10. DisposeFinalize方法在何时被调用

    56810

    .NET面试题解析(06)-GC与内存管理

    解释一下C#里析构函数为什么有些编程建议里推荐使用析构函数呢? 9. Finalize() Dispose() 之间区别? 10. DisposeFinalize方法在何时被调用?...一个变量如果在其生存期内某一刻已经不再被引用,那么,这个对象就有可能成为垃圾 4. GC是什么,简述一下GC工作方式?...using() 只是一种语法形式,其本质还是try…finally结构,可以保证Dispose始终会被执行。 8. 解释一下C#里析构函数为什么有些编程建议里推荐使用析构函数呢?...Finalize() Dispose()都是.NET中提供释放非托管资源方式,他们主要区别在于执行者执行时间不同: finalize由垃圾回收器调用;dispose由对象调用。...另外一个重点区别就是终结器会导致对象复活一次,也就说会被GC回收两次才最终完成回收工作,这也是有些人建议开发人员使用终结器主要原因。 10. DisposeFinalize方法在何时被调用

    64020

    如何在Go中使用切片容量长度

    等一下为什么不是 [01234]? 如果答错了,也担心。从其他语言过渡到Go,这是一个相当普遍错误,在本文中,我们将介绍为什么输出不符合你预期以及如何利用Go细微差别来提高代码效率。...,但是通过使用切片 append函数,我们不再需要考虑支持数组大小。...通过使用 len cap函数,我们仍然可以弄清楚这些事情,但是我们不必太担心它们。 考虑到这一点,让我们回顾一下文章开头测验代码,看看出了什么问题。...虽然这看起来似乎是我们最初想要,但这里重要区别是我们告诉切片要将长度容量都设置为5,make 将切片初始化为 [0,0,0,0,0]然后继续调用 append函数,因此它将增加容量并在切片末尾开始添加新元素...本文并不是要对切片或数组之间差异进行详尽讨论,而只是要简要介绍容量长度如何影响切片以及它们在不同解决方案中作用。

    71010

    Vue3 与 Vue2 Props、全局组件异同点!

    为什么使用 Props 很重要? 首先,我们要了解什么是 props。 props是可在组件上注册自定义属性,可让我们将数据从父组件传递到其子组件方式之一。...为什么 Vue3 props 工作方式与 Vue2 不同? 更改 Vue3 Props 方式主要一个原因,使 this 在组件/方法中含义更清楚。...但是通过消除对 this 大多数引用,而是使用显式contextprops变量,可以提高大型Vue项目的可读性。...与我们在Vue2中声明它们方式稍有不同,但也是非常简单。 什么是全局组件 首先,我们要还了解Vue3全局组件是什么以及为什么使用它。...那么在 Vue3 中呢 在Vue3中,由于创建Vue实例工作方式略有不同(使用createApp),所以代码略有不同,但理解起来同样简单。

    76230
    领券