【JavaScript】关于this的代码输出题总结

2023-11-09

1.在Javascript中,this指向函数执行时的当前对象

function foo() {
  console.log( this.a );
}

function doFoo() {
  foo();
}
  • 该处的执行foo()的时候,执行环境为doFoo函数,而该函数为普通函数,this指向window

2.箭头函数时不绑定this的,它的this来自原其父级所处的上下文

var a = 10
var obj = {
  a: 20,
  say: () => {
    console.log(this.a)
  }
}
obj.say() //10

var anotherObj = { a: 30 } 
obj.say.apply(anotherObj)  //10

  • 该代码的obj对象是在全局定义的,故箭头函数say()方法继承其父级所处的上下文,即windows,所以第一个输出仍然是10,后面虽然让say方法指向了另外一个对象,但是仍不能改变箭头函数的特性,它的this仍然是指向全局的,所以依旧会输出10。
  • 若为say为普通函数,其this指向指向他所在的对象,即输出obj其中的a的值

3.如果call第一个参数传入的对象调用者是null或者undefined,call方法将把全局对象(浏览器上是window对象)作为this的值

function a() {
  console.log(this);
}
a.call(null); 
  • 输出window对象
  • 但若开启了严格模式,null 就是 null,undefined 就是 undefined
'use strict';

function a() {
    console.log(this);
}
a.call(null); // null
a.call(undefined); // undefined
var a = 10; 
 var obj = { 
   a: 20, 
   fn: function(){ 
     var a = 30; 
     console.log(this.a)
   } 
 }
 obj.fn();  // 20
 obj.fn.call(); // 10
 (obj.fn)(); // 20
  • obt.fn.call():这里call的参数啥都没写,就表示null,我们知道如果call的参数为undefined或null,那么this就会指向全局对象this,所以会打印出 10;
  • (obj.fn)():相当于立即执行 obj.fn()

4. 使用new构造函数时,其this指向的是全局环境window

var obj = { 
  name : 'cuggz', 
  fun : function(){ 
    console.log(this.name); 
  } 
} 
obj.fun()     // cuggz
new obj.fun() // undefined

5. 对象不构成单独的作用域

var obj = {
   say: function() {
     var f1 = () =>  {
       console.log("1111", this);
     }
     f1();
   },
   pro: {
     getPro:() =>  {
        console.log(this);
     }
   }
}
var o = obj.say;
o(); //1111 window对象
obj.say(); //1111 obj对象
obj.pro.getPro(); //window对象
  • 调用o():注意此时调用的环境是在全局作用域下,f1() 箭头函数继承父级say function() 在全局作用域中,故打印出window;
  • obj.say():谁调用say,say 的this就指向谁,所以此时this指向的是obj对象;
  • obj.pro.getPro():由于getPro处于pro中,而对象不构成单独的作用域,所以箭头的函数的this就指向了全局作用域window;

6.立即执行函数调用this指向window,对象方法调用this指向该方法所属对象

var myObject = {
    foo: "bar",
    func: function() {
        var self = this;
        console.log(this.foo);  
        console.log(self.foo);  
        (function() {
            console.log(this.foo);  
            console.log(self.foo);  
        }());
    }
};
myObject.func();
//bar bar undefined bar
  • func是由myObject调用,this指向myObject,故self也指向myObject
  • 立即执行匿名函数表达式的this指向window 。立即执行匿名函数的作用域处于myObject.func的作用域中,在这个作用域找不到self变量,沿着作用域链向上查找self变量,找到了指向 myObject对象的self

7. 对象中若存在立即执行函数会直接执行后销毁

window.number = 2;
var obj = {
 number: 3,
 db1: (function(){
   console.log(this);
   this.number *= 4;
   return function(){
     console.log(this);
     this.number *= 5;
   }
 })()
}
var db1 = obj.db1;
db1();
obj.db1();
console.log(obj.number);     // 15
console.log(window.number);  // 40

  • 输出:
    在这里插入图片描述
  • 一开始在初始化obj对象时,立即执行函数this指向window,此时已经执行this.number *= 4window.number为8
  • 然后执行db1()由于返回的是一个普通函数,在全局中调用,this指向window,故window.number为8*5 = 40
function(){
     console.log(this);
     this.number *= 5;
   }
  • 最后执行obj.db1(),this指向obj对象,执行返回的函数,obj.number为3*5 = 15

8.this的指向通常是调用函数的时候确定的,一般指向调用者

var length = 10;
function fn() {
    console.log(this.length);
}
 
var obj = {
  length: 5,
  method: function(fn) {
    fn();
    arguments[0]();
  }
};
 
obj.method(fn, 1);
  • 调用fn()的时候在method方法中执行,对象不构成作用域,故this指向的是window,输出10
  • arguments[0]为fn(),相当于arguments调用方法,this指向arguments,而这里传了两个参数,故输出arguments长度为2

9. 注意对象中函数的写法,函数调用的时机

var a = 1;
function printA(){
  console.log(this.a);
}
var obj={
  a:2,
  foo:printA, //此时的printA还没有被调用
  bar:function(){
    printA(); //已调用
  }
}

obj.foo(); // 2
obj.bar(); // 1
var foo = obj.foo;
foo(); // 1

  • obj.foo(),foo 的this指向obj对象,所以a会输出2;
  • obj.bar(),printA在bar方法中执行,所以此时printA的this指向的是window,所以会输出1;
  • foo(),foo是在全局对象中执行的,所以其this指向的是window,所以会输出1;

10.

var x = 3;
var y = 4;
var obj = {
    x: 1,
    y: 6,
    getX: function() {
        var x = 5;
        return function() {
            return this.x;
        }();
    },
    getY: function() {
        var y = 7;
        return this.y;
    }
}
console.log(obj.getX()) // 3
console.log(obj.getY()) // 6
  • 匿名函数的this是指向全局对象的,所以this指向window,会打印出3;
  • getY是由obj调用的,所以其this指向的是obj对象,会打印出6;

11.

function a(xx){
  this.x = xx;
  return this
};
var x = a(5);
var y = a(6);

console.log(x.x)  // undefined
console.log(y.x)  // 6
  • 函数a是在全局作用域调用,所以函数内部的this指向window对象,故x的值为window,而window对象中没有x属性,所以会输出undefined
  • 当执行y.x时,y为window,并会给全局变量中的x赋值为6,所以会打印出6

12.this绑定的优先级:new绑定 > 显式绑定 > 隐式绑定 > 默认绑定

function foo(something){
    this.a = something
}

var obj1 = {
    foo: foo
}

var obj2 = {}

obj1.foo(2); 
console.log(obj1.a); // 2

obj1.foo.call(obj2, 3);
console.log(obj2.a); // 3

var bar = new obj1.foo(4)
console.log(obj1.a); // 2
console.log(bar.a); // 4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JavaScript】关于this的代码输出题总结 的相关文章

随机推荐

  • C++ 深浅拷贝、写时拷贝

    前言 本章以string类为例介绍浅拷贝与深拷贝 引用计数写时拷贝作为了解内容 string类的模拟实现参考C string类的模拟实现 文章目录 1 浅拷贝 2 深拷贝 3 引用计数 写时拷贝 1 浅拷贝 浅拷贝 对于有申请空间的对象的类
  • Java集合类的总结与比较

    Collection List LinkedList ArrayList Vector Stack Set Map Hashtable HashMap WeakHashMap Collection接口 Collection是最基本的集合接口
  • react自定义useState hook获取更新后值

    您好 如果喜欢我的文章 可以关注我的公众号 量子前端 将不定期关注推送前端好文 在业务中有比较多的场景需要在setState中获取更新后的值从而进行下一步的业务操作 在Class组件中可以通过 this setState name 123
  • 全网最详细中英文ChatGPT-GPT-4示例文档-官网推荐的48种最佳应用场景——从0到1快速入门自然语言指令创建支付API代码(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node js接口请求示例 curl命令示例 json格式示例
  • 分布式系统领域经典论文翻译集

    分布式领域论文译序 sql nosql年代记 SMAQ 海量数据的存储计算和查询 一 google论文系列 1 google系列论文译序 2 The anatomy of a large scale hypertextual Web sea
  • Azure云服务基础其五

    文章目录 Azure云服务基础其五 什么是Azure Kubernetes 服务 创建 Kubernetes集群 部署应用程序 测试应用程序 Azure云服务基础其五 什么是Azure Kubernetes 服务 官网的解释是Azure K
  • docker搭建mysql高可用集群

    docker中搭建mysql高可用集群 percona xtradb cluster percona xtradb cluster是一款很棒的mysql高可用集群解决方案 特点是每个节点都能进行读写且都保存全量的数据 也就是说在任何一个节点
  • 大数据 第一节课 linux基础 基本的操作

    Linux的基础 一 Linux的实验环境 二 安装配置Linux和Linux的目录结构 1 安装Linux的过程中 注意的问题 虚拟机类型 Redhat linux 7 64位 重要的 网卡的类型 仅主机模式 host only IP地址
  • 性能测试(并发负载测试)测试分析

    声明 此文章是从网络上转载下来的 至于真实出处无法找到 在对系统进行测试的时候 通常有一个难点那就是使用LR JMeter等进行了性能测试 但是很难进行测试后的分析 以下很大一部分是从网上转载下的一位前辈对性能测试后的分析的见解 分析原则
  • 一些诗集-自创+整理

    常学问 传统文化常学问 研究中易琢磨神 时时出来抬头看 兼容并包实践真
  • win10和linux双系统免u盘,WIN10下免U盘安装Ubuntu双系统

    目录 一 工具下载 二 安装前的准备工作 三 安装Ubuntu系统 四 注意 最后 附下本文参考的博客 一 工具下载 1 下载Ubuntu操作系统 Ubuntu操作协同最好是去Ubuntu官方网站下载 https ubuntu com do
  • 你知道es是如何计算相似度得分的吗?

    1 es中相似度计算公式 BM25 6 x版本和7 x 版本的es的默认得分计算方式都是BM25 假如用户给定一个输入 Q Q Q 其包含了关键字 q 1
  • Latex插入表格及表格设置

    前言 下面将介绍简单的表格插入与格式设置 更多请参考texdoc中宏包说明 1 导言区 代码如下 示例 documentclass article usepackage ctex 更多表格设置见 texdoc booktab 三线表 tex
  • Unity3D FPS Game:第一人称射击游戏(三)

    耗时一周制作的第一人称射击游戏 希望能帮助到大家 由于代码较多 分为三篇展示 感兴趣的朋友们可以点击查看 Unity3D FPS Game 第一人称射击游戏 一 Unity3D FPS Game 第一人称射击游戏 二 Unity3D FPS
  • linux系统中防火墙脚本,防火墙设置脚本

    防火墙设置脚本 gt success 在web服务器中 只需要开启 web服务 和ssh服务还有 ping 其它的一率禁止 脚本如下 gt warning 在配置防火墙的时 一定要注意 不要把自己关在外面 最简单的方式 是使用脚来处理 bi
  • strtok_s的用法基本解释(2021-07-12)

    strtok s的用法基本解释 char string A string tof tokens nand some more tokens char seps t n char token NULL printf Tokens n char
  • 以太坊Ethereum命令

    etheum命令 查询账户 eth accounts 创建账户 personal newAccount password 查看账户余额 eth getBalance eth accounts 0 或指定具体的账户 eth getBalanc
  • SSO、OAuth2、JWT、CAS、OpenID、LDAP、淘宝微信登录一网打尽

    目录 前言 一 SSO简介 二 OAuth2简介 三 OAuth 2 0 规定了四种获得令牌的流程 1 授权码 Authorization Code 2 隐藏式 Implicit 3 密码式 Resource Owner Password
  • Cache的基本原理以及简单操作

    对于没有接触过底层技术的朋友来说 或许从未听说过cache 毕竟cache的存在对程序员来说是透明的 在接触cache之前 先为你准备段code分析 int arr 10 128 for i 0 i lt 10 i for j 0 j lt
  • 【JavaScript】关于this的代码输出题总结

    1 在Javascript中 this指向函数执行时的当前对象 2 箭头函数时不绑定this的 它的this来自原其父级所处的上下文 3 如果call第一个参数传入的对象调用者是null或者undefined call方法将把全局对象 浏览