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

带你真正了解 JavaScript 中的 this

默认绑定下的 this 在非严格模式的情况下,默认指向全局的 window 对象,而在严格模式的情况下,则指向 undefined。...ps1:以下规则,都是以函数环境为前提的,也就是说,this 是放在函数体内执行的。在非函数环境下,也就是浏览器的全局作用域下,不论是否严格模式,this 将一直指向 window。...ps3:对于 JS 代码中没有写执行主体的情况下,非严格模式默认都是 window 执行的,所以 this 指向的是 window,但是在严格模式下,若没有写执行主体,this 指向是 undefined...硬绑定降低了函数的灵活性,无法再使用隐式绑定或显式绑定修改 this。...使用 new 调用函数(构造调用) 时, 执行函数; 创建一个全新对象(若未返回其他对象时,那么 new 表达式中的函数调用会自动返回这个新对象,若返回了其他对象,则 this 将绑定在返回的对象上);

46140

this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(二)

(要理解 this,就要先理解调用位置) • 如果使用严格模式(strict mode),那全局对象将无法使用默认绑定,因此 this 会绑定到 undefined。...,但是只有 foo() 运行在非 strict mode下时,默认绑定才能绑定到全局对象; 严格模式下与 foo() 的调用位置无关。...• 在使用 new 来调用函数,会自动执行以下操作: 1. 创建一个新对象 2. 让新对象的 __proto__(隐式原型) 等于函数的 prototype(显式原型) 3....是否在某个对象中调用(隐式绑定),this 指向绑定的上下文对象 4. 如果都不是,则是默认绑定,在严格模式下,this 指向 undefined, 非严格模式下,this 指向全局对象。...是否在某个对象中调用(隐式绑定),this 指向绑定对象的上下文 4. 如果都不是,则是默认绑定,在严格模式下,this 指向 undefined, 非严格模式下,this 指向全局对象。 2.

8110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【TypeScript 4.5】002-第 2 章 TypeScript 入门

    TypeScript 错别字提示 代码示例 const user = { name: "大哥", age: 25 } console.log(user.nam) 检查结果 4、TypeScript 未调用函数提示...比较 六、显式类型 1、开启严格模式 修改配置文件 报错了 2、显式类型 定义显式类型 3、类型推断 并非一定要显式定义类型!...true // 开启 null 和 undefined 的检查 2、严格模式 严格模式下报错演示 关闭严格模式 做项目迁移时这么做!...问题 关闭严格模式,类型隐式推断为 any 类型,也就回到了普通的 js 代码的效果了,与是否使用 ts 无区别!...没开启的情况演示 此时未开启严格模式!开启了 noImplicitAny! 开启 strictNullChecks 之后 当前配置 关闭下面两个,开启严格模式也能达到同样的效果!

    9410

    你不知道的js中关于this绑定机制的解析

    this的四种绑定规则: 默认绑定: 规则:在非严格模式下,默认绑定的this指向全局对象,严格模式下this指向undefined function foo() { console.log(this.a...通常不会在代码中混用严格模式和非严格模式,所以这种情况很罕见,知道一下就可以了,避免某些变态的面试题挖坑。...隐式绑定: 规则:函数在调用位置,是否有上下文对象,如果有,那么this就会隐式绑定到这个对象上。...显式绑定: 就像我们上面看到的,如果单纯使用隐式绑定肯定没有办法得到期望的绑定,幸好我们还可以在某个对象上强制调用函数,从而将this绑定在这个函数上。...显式绑定和隐式绑定无法直接比较(会报错),默认绑定是不应用其他规则之后的兜底绑定所以优先级最低,最后的结果是: 显式绑定 > 隐式绑定 > 默认绑定 new绑定 > 隐式绑定 > 默认绑定 箭头函数的this

    43310

    【JS 口袋书】第 8 章:以更细的角度来看 JS 中的 this

    处理全局变量总是有风险的,因此JS引入了“安全模式”:严格模式。严格模式是通过使用“use Strict”启用。严格模式中的一个好处就是消除了默认绑定。...在严格模式下,当试图从全局上下文中访问this时,会得到 undefined 。...即使在全局上下文中调用函数,隐式绑定也在起作用 function whoIsThis() { console.log(this); } whoIsThis(); 咱们无法从代码中看出,但是JS引擎将该函数分配给全局对象...全局变量 this 在严格模式下是undefined为什么咱们的函数试图更新 window.data而不是post.data?...大多数情况下,不希望与全局作用域交互,JS 为此就提供了一种用严格模式来中和默认绑定的方法。在严格模式下,对全局对象的任何引用都是 undefined,这有效地保护了我们避免愚蠢的错误。

    2.7K20

    你不知道的this(2)

    这样看起来硬绑定(也是显式绑定的一种)似乎比new绑定的优先级更高,无法使用new来控制this绑定。...如果是的话,this绑定的是那个上下问对象 var foo = obj1.bar(); 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到undefined,否则绑定到全局对象。...注意:对于默认绑定来说,决定this绑定对象的并不是调用位置是否处于严格模式,而是函数体是否处于严格模式。...问题在于,硬绑定会大大降低函数的灵活性,使用硬绑定之后就无法使用隐式绑定或者显式绑定来修改this。...由call或者apply(或者bind)调用?绑定到指定的对象。 由上下文对象调用?绑定到那个上下文对象。 默认:在严格模式下绑定到undefined,否则绑定到全局对象。

    51610

    【23】进大厂必须掌握的面试题-50个spring面试

    ApplicationContext 它使用延迟初始化 它使用急切/积极的初始化 它使用语法显式提供资源对象 它 自己创建和管理资源对象 它不支持国际化 支持国际化 它不支持基于注释的依赖 它支持基于注释的依赖...默认情况下,Spring容器中未打开注释接线。因此,在使用它之前,需要在Spring配置文件中启用它。例如: 模式是: 默认设置: 这是默认设置,表示没有自动装配。应使用显式bean参考进行接线。 byName: 根据bean的名称注入对象依赖。...令人困惑的性质:始终喜欢使用显式接线,因为自动装配不太精确。 Spring Annotations–Spring面试题 24.您对基于注释的容器配置的含义是什么?...该批注用于将setter方法,构造函数,一个或多个具有任意名称或多个参数的方法自动连接到bean。默认情况下,它是类型驱动的注入。

    1K21

    JavaScript的变量

    声明变量 在 JavaScript 中,声明变量使用 var 语句。 示例1 在一个 var 语句中,可以声明一个或多个变量,也可以为变量赋值,未赋值的变量初始化为 undefined(未定义)值。...var a = 1; var a = 2; var a = 3; document.write(a); //返回 3 注意: 在非严格模式下,JavaScript 允许不声明变量就直接为其赋值,这是因为...隐式声明的变量总是作为全局变量使用。在严格模式下,变量必须先声明,然后才能使用。 新增的变量声明方式 var,let 和 const const定义的变量不可以修改,而且必须初始化。...//声明并初始化局部变量 document.write(a); //显示 2 } f(); //调用函数 由于在函数内部声明了一个同名局部变量 a,所以在预编译期,JavaScript 使用该变量覆盖掉全局变量在函数内部的影响...为了避免此类问题,应该养成在函数体内使用 var 语句显式声明局部变量的习惯。

    17610

    Javascript 严格模式详解

    一、概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。...另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。...4.1 全局变量显式声明 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。...[2,1] (3)禁止使用arguments.callee 这意味着,你无法在匿名函数内部调用自身了。   ...为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

    1.2K80

    Javascript 严格模式 “use strict”

    另一方面,同样的代码,在”严格模式”中,可能会有不一样的运行结果;一些在”正常模式”下可以运行的语句,在”严格模式”下将不能运行。...4.1 全局变量显式声明 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。...(1)禁止使用with语句 因为with语句无法在编译时就确定,属性到底归属哪个对象。   ...[2,1] (3)禁止使用arguments.callee 这意味着,你无法在匿名函数内部调用自身了。   ...为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

    96410

    JS入门难点解析7-this

    随着使用模式越来越复杂,显式传递上下文对象会让代码变得越来越混乱,使用 this 则不会这样。后面介绍对象和原型时,你就会明白函数可以自动引用合适的上下文对象有多重要。...你使用的是非严格模式,你是在浏览器环境运行而不是在node运行,你是独立调用的foo而正好bar在全局声明。是不是很巧合呢?是不是有点迷糊,不要紧,继续往下看。...第二点,代码视图在bar里面打印foo的变量,这里是完全错误的,因为bar在运行时,this也是指向了全局(非严格模式,下面我们的讨论都是基于运行于浏览器的非严格模式)。...使用函数调用模式调用函数时,非严格模式下,this被绑定到全局对象;在严格模式下,this是undefined。 以下是四种常见的独立调用场景。...要注意以下几点: 构造函数通常不使用return关键字,它们通常初始化新对象,当构造函数的函数体执行完毕时,它会显式返回。在这种情况下,构造函数调用表达式的计算结果就是这个新对象的值。

    74710

    JavaScript 中 this 的四条绑定规则

    默认绑定 独立函数调用时,this 指向全局对象,如果使用严格模式,那么全局对象无法使用默认绑定, this绑定至 undefined。...绑定到全局对象或者 undefined 上,取决于是否在严格模式下运行。...除了开发人员自定义的函数,在将函数传入语言内置的函数比如 setTimeout 时,同样会发生隐式丢失的情况。 3. 显式绑定 显式绑定的核心是 JavaScript 内置的 call(..)...显式绑定仍然无法解决丢失绑定问题。 3.1 硬绑定 作为显式绑定的一个变种,硬绑定可以解决丢失绑定问题。...var bar = obj1.foo(); 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到 undefined,否则绑定到全局对象。

    47730

    你不知道的 this 指向优先级

    非严格模式下?)。...二、this 的四种绑定规则 在 JavaScript 中,this 指向的绑定规则有以下四种: 默认绑定(非严格模式情况下,this 指向 window, 严格模式下,this指向 undefined...隐式绑定(如果函数调用时,前面存在调用它的对象,那么this就会隐式绑定到这个对象上) 显式绑定(函数通过 call()、apply()、bind()调用,this 指向被绑定的对象。)...显式绑定 这种绑定方式就是使用 Function.prototype 中的三个方法 call(), apply(),和 bind() 了。...在 JavaScript 中,所有的函数都可以被 new 调用,这时候这个函数一般会被称为 “构造函数”,实际上并不存在所谓“构造函数”,更确切的理解应该是对于函数的 “构造器调用模式”。

    59310

    《你不知道的JavaScript》:this 绑定规则的优先级

    前面两篇讲了this的调用位置影响和绑定规则,在一般情况下想要弄清this的指向,只需找到函数的调用位置和并判断应当应用哪条绑定规则即可。...所以结论是:显式绑定 优先级 > 隐式绑定 再来比较下隐式绑定和 new 绑定的优先级。...在举例前有个前提条件要先说下,new 和 call/apply 无法一起使用,因此无法通过 new fn.call(obj1) 来直接测试,但可以使用硬绑定来测试它们的优化级。...,即隐式绑定,则函数中this绑定的就是那个上下文对象,var bar = obj.fn(); 如果以上情况都不是的话,就是默认绑定,这里分两种情况:如处于严格模式,则this被绑定到undefined...上;如处于非严格模式,则this绑定到全局对象上。

    48720

    【5】进大厂必须掌握的面试题-Java面试-spring

    spring的自动注入模式是什么?什么是自动装配模式? 自动装配使程序员能够自动注入Bean。我们不需要编写显式的注入逻辑。 让我们看看使用依赖注入来注入bean的代码。...模式 描述 1) 没有 这是默认模式,这意味着未启用自动装配。 2) 按名字 根据属性名称注入bean。它使用setter方法。 3) 按类型 根据属性类型注入bean。它使用setter方法。...全局异常处理程序: 异常处理是一个跨领域的问题,Spring提供了@ControllerAdvice批注,我们可以将其与任何类一起使用来定义全局异常处理程序。...您使用了哪些重要的Spring批注? 我在项目中使用的一些Spring注释是: @Controller –用于Spring MVC项目中的控制器类。...他们是: 程序化事务管理: 在这种情况下,借助编程来管理事务。它为您提供了极大的灵活性,但是很难维护。 声明式事务管理: 在此,事务管理与业务代码分开。仅注释或基于XML的配置用于管理事务。

    98520

    C++(类和对象)

    类中既有成员变量也有成员函数,那我们需要计算成员函数的大小吗? 用编译器运行一下 可以看到编译器在计算时并没有计算成员函数的大小,只计算了成员变量的大小。...我们不妨猜想一下,每个成员变量的大小是不同的,但是如果每个对象的成员函数也存一份的话,这样会产生巨大的开销,每个成员变量调用的都是相同的函数,所以只需要将成员函数在公共区域存一份即可,然后每个成员变量再调用时...,Print函数没有传递参数,实际是传递了d1的地址,然后用一个被const修饰的指针this来接收,最后用this指针对d1中存的值进行访问,注意这里this指针在声明函数的时候是不能写出来的,但在函数内部可以显式进行用的...如果类中没有显式写出构造函数,则编译器会自动生成一个构造函数,如果编译器中有了显式写出了构造函数则编译器就不会生成构造函数了。...一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构 函数不能重载 对象生命周期结束时,C++编译系统系统自动调用析构函数。

    9310

    Javascript中this的一些简单理解

    this是JavaScript中的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。...this实际是在函数被调用时才发生的绑定,也就是说this具体指向什么,取决于你是怎么调用的函数。...this的四种模式 1.默认绑定 这是函数最通常的用法,func()是直接调用的(独立函数调用),没有应用其他的绑定规则,这里进行了默认绑定,将全局对象绑定this上,因此this就代表全局对象Global...var name = '贝吉塔' var func = function { console.log(this.name) } func() //贝吉塔 注意:在严格模式下,全局对象将无法使用默认绑定...'卡卡罗特' console.log(this.q) } var obj = new Func //卡卡罗特 console.log(this.q) //贝吉塔 4.显式绑定 通过函数的

    28410

    【5】进大厂必须掌握的面试题-Java面试-spring

    spring的自动注入模式是什么?什么是自动装配模式? 自动装配使程序员能够自动注入Bean。我们不需要编写显式的注入逻辑。让我们看看使用依赖注入来注入bean的代码。...模式 描述 1) 没有 这是默认模式,这意味着未启用自动装配。 2) 按名字 根据属性名称注入bean。它使用setter方法。 3) 按类型 根据属性类型注入bean。它使用setter方法。...全局异常处理程序: 异常处理是一个跨领域的问题,Spring提供了@ControllerAdvice批注,我们可以将其与任何类一起使用来定义全局异常处理程序。...您使用了哪些重要的Spring批注? 我在项目中使用的一些Spring注释是: @Controller –用于Spring MVC项目中的控制器类。...他们是: 程序化事务管理: 在这种情况下,借助编程来管理事务。它为您提供了极大的灵活性,但是很难维护。 声明式事务管理: 在此,事务管理与业务代码分开。

    56710
    领券