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

js this对象作用域

在JavaScript中,this关键字是一个非常重要的概念,它指向当前执行代码的环境对象。this的值在函数被调用时确定,而不是在函数定义时确定。this的作用域取决于函数的调用方式。以下是几种常见的情况:

1. 全局作用域中的this

在全局执行上下文中(即任何函数体外部),this指向全局对象。在浏览器中,这通常是window对象。

代码语言:txt
复制
console.log(this.document === document); // true
this.a = 37;
console.log(window.a); // 37

2. 函数中的this

在普通函数中,this的值取决于函数的调用方式。

直接调用

如果函数是直接调用的,this通常指向全局对象(在严格模式下是undefined)。

代码语言:txt
复制
function f1(){
  return this;
}
f1() === window; // 非严格模式下为true

作为对象方法调用

如果函数作为对象的方法被调用,this指向调用该方法的对象。

代码语言:txt
复制
var o = {
  prop: 37,
  f: function() {
    return this.prop;
  }
};
console.log(o.f()); // logs 37

3. 构造函数中的this

当函数用作构造函数(使用new关键字)时,this指向新创建的对象实例。

代码语言:txt
复制
function C(){
  this.a = 37;
}
var o = new C();
console.log(o.a); // logs 37

4. 使用.call().apply()调用函数

通过.call().apply()方法调用函数时,可以显式指定this的值。

代码语言:txt
复制
function f(){
  return this.a;
}
var o = {a: 37};
console.log(f.call(o)); // logs 37

5. 箭头函数中的this

箭头函数没有自己的this绑定,它会捕获其所在上下文的this值。

代码语言:txt
复制
var o = {
  a: 37,
  f: function() {
    var arrow = () => this.a;
    return arrow();
  }
};
console.log(o.f()); // logs 37

应用场景

  • 对象方法:在对象的方法中使用this来引用对象的属性和方法。
  • 构造函数:在构造函数中使用this来初始化新对象的属性。
  • 事件处理:在事件处理程序中使用this来引用触发事件的元素。
  • 回调函数:在使用回调函数时,需要注意this的值可能会改变,可以使用箭头函数或者.bind()方法来保持this的正确引用。

常见问题及解决方法

问题:在回调函数中this的值不是预期的对象。 解决方法

  1. 使用箭头函数,因为它会继承外层函数的this值。
  2. 使用.bind(this)来创建一个新函数,其this值被永久绑定到指定的对象。
代码语言:txt
复制
var o = {
  a: 37,
  f: function() {
    setTimeout(function() {
      console.log(this.a); // undefined
    }.bind(this), 100);
  }
};
o.f(); // logs 37

理解this的工作原理对于编写高质量的JavaScript代码至关重要。通过掌握不同情况下的this行为,可以避免许多常见的陷阱和错误。

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

相关·内容

JS作用域和作用域链

JS中的作用域就是在一定的空间范围内对数据进行读写操作。 在JS中一个变量的作用域(scope)是程序中定义这个变量的区域。 变量有全局变量和局部变量两种。...下面就要借助JS的作用域链来更好的理解作用域了。 在此之前,先要明确个概念,即执行环境和作用域是两个完全不同的概念。 函数的每次调用都有与之紧密相关的作用域和执行环境。...作用域链包含了执行环境栈中的每个执行环境对应的变量对象。通过作用域链,可以决定变量的访问和标识符的解析。 注意:全局执行环境的变量对象始终都是作用域链的最后一个对象。...搜索过程始终从作用域链的前端开始,然后逐级地向后(全局执行环境)回溯,直到找到标识符为止。 此外还要讲下JS作用域中的块级作用域。 JS中是没有块级作用域这个概念的。 什么是块级作用域呢?...JS并不支持块级作用域,它只支持函数作用域,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的。 那么JS又该怎么拥有块级作用域呢?

4.1K30
  • JS基础——作用域、作用域链

    作用域 [[scope]],函数定义时自动生成的一个隐式属性,是用来存储函数作用域链 Scope Chain的容器。作用域链是用来存储函数执行上下文 AO和全局执行上下文 GO的容器。...函数被定义时,系统会为函数生成[[scope]],[[scope]]中保存该函数的作用域链,并从该作用域链的起始位置开始存储当前环境的作用域链。...函数被定义后&将要执行前会生成函数本身的AO,并将其插入作用域链的起始位置。...,并将GO插入到作用域链的起始位置。...函数a被执行时,此时函数b也被定义,函数b的[[scope]]也在此时生成,其中存储函数b的作用域链,并将当前环境的作用域链插入函数b作用域链的起始位置,即函数a的AO和GO。

    3.5K10

    JS进阶:作用域和作用域链

    作用域(Scope) 1.什么是作用域 作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。...2.全局作用域和函数作用域 在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域: 最外层函数 和在最外层函数外面定义的变量拥有全局作用域 var outVariable...一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。...全局作用域有个弊端:如果我们写了很多行 JS 代码,变量定义都没有用函数包括,那么它们就全部都在全局作用域中。这样就会 污染全局命名空间, 容易引起命名冲突。...因为放在里面的所有变量,都不会被外泄和暴露,不会污染到外面,不会对其他的库或者 JS 脚本造成影响。这是函数作用域的一个体现。

    2.6K20

    了解 JS 作用域与作用域链

    JS中的声明提前 js中的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。...引入一大段话来解释: 每一段js代码(全局代码或函数)都有一个与之关联的作用域链(scope chain)。 这个作用域链是一个对象列表或者链表,这组对象定义了这段代码中“作用域中”的变量。...x的属性,js会继续查找链上的下一个对象。...作用域链举例: 在js最顶层代码中(也就是不包括任何函数定义内的代码),作用域链由一个全局对象组成。...在不包含嵌套的函数体内,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象。 在一个嵌套的函数体内,作用域上至少有三个对象。 3.

    2K10

    js作用域详解

    js对象 众所周知,js的所有数据类型都是一个对象,例如: var a = 1; console.log 声明a=1;a属于number类型,但是number类型又是number对象,有着以下方法: interface...atest其实是一个window对象下的方法对象 var 局部变量作用域 var 声明一个对象,只作用域当前作用域以下。...在闭包函数中声明的变量,只能在闭包函数内的作用域,以及下层作用域使用,可通过return 对象中,通过return对象中声明的方法进行返回,使得上级作用域能成功访问到闭包作用域的变量 return作用域变量访问情况...总结 1:js万物皆对象,所有变量都是对象类型。...2:js的作用域是往下通用的,下层作用域可访问上层作用域的变量,并可修改值 3:js下层作用域变量和上层同名冲突时,下层作用域将覆盖上层变量,但上层作用域的访问不受影响 4:不适用var方法定义的变量,

    2.5K10

    原生JS | 作用域

    HTML5学堂-码匠:作用域那些必须掌握的知识,还有大量作用域案例练习与分析,快快进来! 作用域的基础知识 在JavaScript中,每个变量会有一个有效区域(范围),这个就是作用域。...一个变量在其作用域内是可以被访问的,在作用域外不能被访问。 全局作用域与局部作用域 变量的执行环境有两种:一种是全局,另一种是局部(如:放在函数里面)。...如果window下也不存在该空间,会在全局作用域之下进行空间的创建。 作用域链 由于在全局作用域当中会包含局部作用域,局部作用域当中还可以再包含局部作用域。...当有多层作用域时,深层的作用域中查找变量时,会按照“当前作用域”到“上层作用域”再到“全局作用域”的顺序进行查找,这个查找的顺序就可以理解为作用域链。...); 运行结果: 'HTML5学堂' 'HTML5学堂' 在全局作用域下创建的变量,其实就是window对象的属性/方法。

    4.8K50

    JS进阶-作用域

    局部作用域 定义:局部作用域的意思就是,变量只能在它的代码块或者函数内部访问,而不能在外部访问,局部作用域的变量在函数或代码块执行完后会销毁,不会影响全局作用域变量。...作用域链:局部作用域可以访问外部作用域的变量,但外部作用域无法访问局部变量。 全局作用域 定义:全局作用域指的是变量或函数在整个程序的任何地方都可以访问,且不会被局部作用域所限制。...全局作用域的变量会成为 window(浏览器环境)或 global(Node.js 环境)对象的属性。 在任何地方(函数、代码块等)都可以访问全局变量。...作用域链 定义:作用域链是js中的变量查找机制! 是一个查找机制!!指的是当一个变量在当前作用域找不到时,js会沿着作用域的层级结构向上查找,直到找到该变量或到达全局作用域。...引用计数(早期):每个对象有一个引用计数,某个变量引用该对象的时候标记+1,某个变量不引用对象-1,当某个对象标记为0的时候,回收对象。

    9610

    「JavaScript」作用域与对象

    1 - 作用域 1.1 作用域概述 通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。...JavaScript(es6前)中的作用域有两种: 全局作用域 局部作用域(函数作用域) 1.2 全局作用域 作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件。...1.3 局部作用域 作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域。 1.4 JS没有块级作用域 块作用域由 { } 包括。.../ 报错 以上java代码会报错,是因为代码中{}即一块作用域,其中声明的变量num,在{}之外不能使用;而与之类似的JavaScript代码,则不会报错,JS中没有块级作用域(在ES6之前): if(...预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义。 代码执行: 从上到下执行JS语句。

    39420

    js中的作用域

    前言 相信自从es6出来之后,你一定多少知道或者已经在项目中实践了部分的块级作用域,在函数或者类的内部命名变量已经在使用let了,但是你知道它真正的作用是什么吗?...又是因为什么我们要用这个块级作用域,本文与你一起探讨块级作用域的场景以及所有细节问题。...es6之前的作用域 特点1 :js只有函数级作用域以及全局两种 特点2 :不通过var声明的变量直接赋值也可以用并且可以访问,原理是直接赋值到了window对象属性变量下,两者如果同时定义,那么会覆盖使用...,函数内可以访问外部作用域,而全局是不可以访问函数作用域内的变量或者方法的 var a=b=c=12 function demo(){ var z=13 console.log(b)//12...块级作用域 场景一 循环中的块级作用域 如果我们有一个遍历循环的绑定事件,并且需要把当前的指针绑定到对应方法中。

    3.2K20

    JS学习系列 03 - 函数作用域和块作用域

    在 ES5 及之前版本,JavaScript 只拥有函数作用域,没有块作用域(with 和 try...catch 除外)。在 ES6 中,JS 引入了块作用域,{ } 内是单独的一个作用域。...采用 let 或者 const 声明的变量会挟持所在块的作用域,也就是说,这声明关键字会将变量绑定到所在的任意作用域中(通常是 {...} 内部)。 今天,我们就来深入研究一下函数作用域和块作用域。...函数中的作用域 函数作用域的含义是指,属于这个函数的任何声明(变量或函数)都可以在这个函数的范围内使用及复用(包括这个函数嵌套内的作用域)。...console.log(a); // 报错,a is not defined console.log(b); // 报错,a is not defined 复制代码 用 with 从对象中创建出的作用域仅在...总结 函数是 JavaScript 中最常见的作用域单元。块作用域指的是变量和函数不仅可以属于所处的函数作用域,也可以属于某个代码块。

    1.6K10

    JS学习系列 03 - 函数作用域和块作用域

    在 ES5 及之前版本,JavaScript 只拥有函数作用域,没有块作用域(with 和 try...catch 除外)。在 ES6 中,JS 引入了块作用域,{ } 内是单独的一个作用域。...采用 let 或者 const 声明的变量会挟持所在块的作用域,也就是说,这声明关键字会将变量绑定到所在的任意作用域中(通常是 {...} 内部)。 今天,我们就来深入研究一下函数作用域和块作用域。...函数中的作用域 函数作用域的含义是指,属于这个函数的任何声明(变量或函数)都可以在这个函数的范围内使用及复用(包括这个函数嵌套内的作用域)。...} console.log(a); // 报错,a is not defined console.log(b); // 报错,a is not defined 用 with 从对象中创建出的作用域仅在...总结 函数是 JavaScript 中最常见的作用域单元。块作用域指的是变量和函数不仅可以属于所处的函数作用域,也可以属于某个代码块。

    12910

    js作用域、作用域链和它的一些优化

    一个作用域能够在自身内部创建一个新作用域从而形成内部和外部作用域的嵌套关系。全局作用域作为JavaScript的初始作用域,是所有其他作用域最外层的作用域。...作用域的一些实现细节在JavaScript中,每一个函数、代码块{...}以及script脚本被运行前,都会有一个相对应的称为词法环境(Lexical Environment) 的内部关联对象被创建。...词法环境由两部分组成:环境记录(Environment Record):一个存储所有局部变量作为其属性(包括一些执行上下文信息,例如this的值)的对象。...根据上面的概念,我们可以通过下面的对象结构理解词法环境: lexicalEnvironment = { environmentRecord: { : 对象console上的方法,对该方法的调用需要引用console。

    1.7K00

    JS作用域与闭包

    JS的作用域分为全局作用域和函数作用域。 2|0全局作用域 全局作用域在页面打开时创建,在页面关闭时销毁。...当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。 作用域链是由当前环境与上层环境的一系列变量对象组成,保证了当前执行环境对符合访问权限的变量和函数的有序访问。...作用域链是由一系列变量对象组成,我们可以在这条链中,查询变量对象中的标识符,这样就可以访问到上一层作用域中的变量了。...例如: innerTest()的局部环境开始时会先在自己的变量对象中搜索变量和函数名,如果搜索不到则再搜索上一级作用域链。 test()的作用域链中只包含两个对象: 自己的变量对象和全局变量对象。...因为内部函数的作用域链中包含createComparisonFunction()的作用域。 一般来讲,当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)。

    1.9K20

    JS中作用域下 21

    ES6之前和ES6分开研究 1.需要明确: 1.ES6定义变量通过let 2.ES6除了全局作用域、局部作用域以外, 还新增了块级作用域...3.ES6虽然新增了块级作用域, 但是通过let定义变量并无差异(都是局部变量) 2.ES6作用域链 1.1.全局作用域我们又称之为0级作用域 2.2....定义函数或者代码块都会开启的作用域就是1级/2级/3级/...作用域 2.3.JavaScript会将这些作用域链接在一起形成一个链条, 这个链条就是作用域链 0...---> 1 ----> 2 ----> 3 ----> 4 2.4.除0级作用域以外, 当前作用域级别等于上一级+1 3.变量在作用域链查找规则...3.1先在当前找, 找到就使用当前作用域找到的 3.2如果当前作用域中没有找到, 就去上一级作用域中查找 3.3以此类推直到0级为止, 如果0级作用域还没找到, 就报错

    1.3K20
    领券