JavaScript this 关键字

概述

任何执行 JavaScript 的环境称之为 执行上下文JavaScript 运行时 维护这些执行上下文的堆栈,并且当正在执行存在于该堆栈顶部的执行上下文。this 变量引用的对象每次更改执行上下文时都会更改。

默认情况下,执行上下文是全局的,这意味着如果代码作为简单函数调用的一部分执行,则该 this 变量将引用 全局对象 。在浏览器的情况下,全局对象是 windows 对象。但在 NodeJS 环境中,this 值是一个特殊的 global 对象。

简单函数

  // 案例 1,简单函数,浏览器下的 this -> window,NodeJS 下的 this -> global
  function simple1() {
    console.log("案例 1,简单函数");
    console.log("我是简单函数,this 指向 window");
    console.log(this);
  }
  simple1();

严格模式

  // 案例 2,严格模式,this -> undefined
  function simple2() {
    'use strict';
    console.log("案例 2,严格模式");
    console.log("我是严格模式,this 指向 undefined");
    console.log(this);
  }
  simple2();

构造函数

当我们调用 new User,JavaScript 会在 User 函数内创建一个新对象并把它保存为 this 。接着,name, ageinfo 属性会被添加到新创建的 this 对象上。

  // 案例 3,构造函数,此时在执行上下文中创建了 this 对象,并在这个 this 对象中增加了 name, age, info 三个属性
  function User(name, age) {
    this.name = name;
    this.age = age;

    this.info = function () {
      console.log("我是 User 对象中的 info 属性")
      console.log(`${this.name} ${this.age}`);
    };
    console.log("案例 3,构造函数");
    console.log("我是 User 对象,我在执行上下文中创建了 this 对象,并增加了 name, age, info 三个属性");
    console.log(this);
  }
  let andy = new User('Andy', 22);
  andy.info();

简单对象 1

当某个属性被发起普通函数调用时,则 this 指向 window 对象

  // 案例 4,简单对象
  let user = {
    name: '小明',
    age: userAgeFunction,
    sex: function () {
      console.log("我是 user 对象的 sex 属性,this 指向 user 对象,而不是全局对象");
      console.log(this);
    },
    talk: function () {
      console.log(this);
    }
  };
  function userAgeFunction() {
    console.log("我是 user 对象的 age 属性,this 指向 user 对象,而不是全局对象");
    console.log(this);
  }
  console.log("案例 4,简单对象");
  user.age();
  user.sex();

  let talk = user.talk;
  console.log("我是 talk,我把 user 对象的 talk 属性当普通函数调用了,所以这里的 this 指向 window");
  talk();

简单对象 2

age 函数内部, this 指向 lee 对象,但是,在 innerAge 函数内部,this 指向全局对象,规则告诉我们无论何时一个普通函数被调用时,那么 this 将指向全局对象。

  // 案例 5,简单对象 2
  let lee = {
    name: 'lee',
    birth: 1998,
    age: function () {
      console.log("我是 lee 对象的 age 属性,this 指向 lee 对象,而不是全局对象");
      console.log(this);
      function innerAge() {
        console.log("我虽然是 lee 对象中的 age 属性中的 innerAge() 函数,但我会被普通调用,所以这里的 this 指向 window,而不是 lee 对象");
        console.log(this);
      }
      // 这里发起 lee 对象 age 属性内部的 innerAge() 普通调用,所以该函数中的 this 指向 window
      innerAge();
    }
  };
  console.log("案例 5,简单对象");
  lee.age();

call、apply、bind

  • call:将 this 指向目标对象
  • apply:将 this 指向目标对象,在参数形式为数组时使用该方法
  • bind:将 this 指向传递的第一个参数并返回一个新方法
    function User(username, password) {
        this.username = username;
        this.password = password;
        this.displayUser = function() {
            console.log(`User: ${this.username} ${this.password}`);
        }
    }

    let user1 = new User("admin", "123456");
    let user2 = new User("guest", "abcdef");

    console.log("案例 6,call apply bind");
    console.log("我是 user1 对象");
    user1.displayUser();
    console.log("我是 user2 对象")
    user2.displayUser();
    console.log("我是 user1 对象,我使用了 call 方法将我的 this 指向了 user2")
    user1.displayUser.call(user2);
    console.log("我是 user1 对象,我使用了 apply 方法将我的 this 指向了 user2")
    user1.displayUser.apply(user2);
    console.log("我是 user1 对象,我使用了 bind 方法将我的 this 指向了 user2 并返回了一个新的方法")
    let user2Display = user1.displayUser.bind(user2)
    user2Display()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "this"关键字JavaScript中表示当前上下文中的对象。在函数中,"this"指向调用该函数的对象,而在全局作用域中,"this"指向全局对象(通常是window对象)。使用"this"关键字可以访问对象的属性和方法。 ### 回答2: JavaScript中的`this`关键字是一个非常重要的概念,它代表着当前函数的执行上下文(execution context)。它表示了当前代码正在执行的情境,在不同的情境下,`this`所代表的对象是不同的。 在全局作用域下,`this`指向的是全局对象,在浏览器中为`window`对象,在Node.js中为`global`对象。如下所示: ```javascript console.log(this === window); // true,在浏览器中输出 true ``` 当在一个函数中使用`this`关键字时,`this`所代表的对象会根据函数的调用方式而变化。常见的函数调用方式有四种,分别是函数调用、方法调用、构造函数调用和apply/call/bind方法调用。 1. 函数调用时,`this`指向全局对象或undefined(严格模式下)。 ```javascript function test() { console.log(this); } test(); // 全局作用域下 this 指向 window,输出 window ``` 2. 方法调用时,`this`指向调用该方法的对象。 ```javascript var person = { name: 'Tom', sayHello: function() { console.log('Hello, ' + this.name); } } person.sayHello(); // 方法调用,此时的 this 指向 person 对象,输出 Hello, Tom ``` 3. 构造函数调用时,`this`指向新创建的对象。 ```javascript function Person(name) { this.name = name; } var tom = new Person('Tom'); // 构造函数调用,此时的 this 指向新创建的对象 tom console.log(tom.name); // 输出 Tom ``` 4. apply/call/bind方法调用时,`this`指向指定的对象。 ```javascript var person1 = { name: 'Tom' }; var person2 = { name: 'Jerry' }; function sayName() { console.log('My name is ' + this.name); } sayName(); // 输出 My name is undefined sayName.apply(person1); // apply方法调用,此时的 this 指向 person1 对象,输出 My name is Tom var sayName1 = sayName.bind(person2); sayName1(); // bind方法调用,此时的 this 指向 person2 对象,输出 My name is Jerry ``` 总之,`this`关键字的作用非常重要,它可以让我们更加灵活地编写代码,但同时也需要注意使用它的场景和调用方式。 ### 回答3: JavaScript中的this关键字是一个非常重要的概念,它用于访问当前对象的上下文。它代表执行当前方法的对象。当我们在JavaScript中编写代码时,this关键字的上下文可以是全局对象,当前对象、任意对象或函数的作用域。 当我们在全局范围内使用this时,它将指向浏览器窗口或全局对象。而在对象里,this关键字则代表该对象。例如,如果我们在一个名为person的对象中使用this,它将返回person对象: ``` const person = { name: 'Tom', age: 30, greet() { console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`); } }; person.greet(); // 输出'Hello, my name is Tom and I am 30 years old.' ``` 当我们在函数内部使用this时,它可能会与预期的结果不同。在函数内部,this关键字通常为undefined。这是因为在JavaScript中,函数是一等对象,可以作为参数传递,并且可以按照不同的方式调用。因此,this关键字的上下文取决于如何调用该函数。 一种解决这个问题的方法是使用箭头函数。箭头函数的this关键字始终指向定义该函数的作用域: ``` const person = { name: 'Tom', age: 30, greet() { const sayHello = () => { console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`); } sayHello(); } }; person.greet(); // 输出'Hello, my name is Tom and I am 30 years old.' ``` 在这个例子中,箭头函数中的this关键字始终指向person对象。通过使用箭头函数,我们可以避免错误的this关键字上下文,并确保我们能够正确地访问对象的属性和方法。 总之,JavaScript中的this关键字非常重要,可以帮助我们访问当前对象的上下文。在函数内部使用时需要谨慎,可以考虑使用箭头函数来避免错误的上下文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值