【JavaScript】题(牛客网)——熟练使用函数调用,超详细讲解

news2024/11/16 21:23:59

1 熟练使用函数调用

1.1 题目

执行以下程序,输出结果为

var uname = "window";
var object = {
  uname: "object",
  fun: function () {
    console.log(this.uname);
    return function () {
      console.log(this.uname);
    };
  },
};

object.fun()();

1.2 答案

object
window

1.3 分析

官方解析:

object.fun()()等效于var fn = object.fun(); fn();
实际上是调用函数两次,第一次是调用object对象的fun函数,第二次是调用fun函数的返回函数。
第一次调用fun函数时,this指向上一级对象,即object对象,因此输出对象objectuname属性值object,
第二次调用的返回函数,其this指向window对象,这是因为匿名函数具有全局性,匿名函数的this指向window对象,因此输出结果为window对象的uname属性值window

详细解析及拓展:

var object = {
  uname: "object",
  fun: function () {
    console.log(this.uname);
    return function () {
      console.log(this.uname);
    };
  },
};

1.3.1 object.fun

object.fun;
console.log("---")
console.log(object.fun, "---object.fun")
console.log("---")

输出

---
ƒ () {                         // 输出 object.fun 本身的值
    console.log(this.uname);
    return function () {
      console.log(this.uname);
    };
  } '---object.fun'
---

在这里插入图片描述

首先定义了一个 object 对象,其有两个属性,unamefun,所以,object.fun 的值是一个函数,准确地说是 object.fun 指向一个下面这样的函数

function () {
	console.log(this.uname);
	return function () {
	  console.log(this.uname);
	};
}

object.fun; 语句不会调用函数, object.fun(); 语句才会调用函数

1.3.2 object.fun()

object.fun();
console.log("---")
console.log(object.fun(), "---object.fun()")
console.log("---")

输出

object                            // 执行 object.fun()
---
object                            // 执行 object.fun(),再输出 object.fun() 本身的值
ƒ () {
      console.log(this.uname);
    } '---object.fun()'
---

在这里插入图片描述

object.fun() 是调用 object.fun 函数,

// object.fun 函数
function () {
	console.log(this.uname);     // 调用该函数,这里输出 this.uname 
	return function () {         // return 语句返回一个函数
	  console.log(this.uname);
	};
}

由于 object.fun 返回一个函数,所以 object.fun() 的值是一个下面这样的函数

function () {
  console.log(this.uname);
}

这里的this指向什么?

object.fun(); 语句是指调用 object.fun 所指向的函数,这个函数又是普通函数,普通函数内部的 this 指向函数运行时所在的对象, 所以这里的 this 指向 object,因此 this.unameobject.uname"object"

1.3.3 object.fun()()

object.fun()();
console.log("---")
console.log(object.fun()(), "---object.fun()()")
console.log("---")

输出

object                           // 调用 object.fun()()
window
---
object                           // 调用 object.fun()()
window 
undefined '---object.fun()()'    // 再输出 object.fun()() 本身的值
---

在这里插入图片描述

object.fun()() 是两个步骤,先执行 object.fun(),得到一个 return 的普通函数 fun1,再执行 fun1(),即

object.fun()();
// 即
(object.fun())();
// 即
var fun1 = object.fun();
fun1();

先执行 object.fun(),输出 object,再执行 fun1();

// fun1 函数
function () {
  console.log(this.uname);  // 调用该函数,这里输出 this.uname 
}

由于 object.fun() 没有 return 语句,所以 object.fun()() 本身没有值,所以返回 undefined

这里的this指向什么?

实际上执行的这两步,第二步执行普通函数 fun1(); 不是由 object 调用的,是处于全局,所以这里的 this 指向 windowthis.unamewindow.uname,因此输出 "window"

1.4 知识点

  1. 立即调用的函数表达式(IIFE)
  • 根据 JavaScript 的语法,圆括号()跟在函数名之后,表示调用该函数。比如,print()就表示调用print函数。
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();
  1. this指向
  • 箭头函数: () => {} 没有自己的 this 对象, 内部的 this 就是定义时上层作用域中的 this, this 指向是固定的
  • 普通函数: fun() {} 内部的 this 指向函数运行时所在的对象, this 指向是可变的

知识点不多,但用起来还需小心,如有错误或不理解的点,欢迎指出。如需了解更详细的知识点,跳转☞【JavaScript】 函数 function

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThingsBoard-设备配置

1、概述 从 ThingsBoard 3.2 开始,租户管理员可以使用设备配置文件为多个设备配置通用设置。每个设备在单个时间点都有一个且唯一的配置文件。 有经验的 ThingsBoard 用户会注意到设备类型已被弃用,取而代之的是设备配置文件。更新脚本将根据唯一的设备类型自动创建设备配置…

三、Java面向对象

1 . 方法 方法(method)是程序中最小的执行单元方法就是一些代码的打包 需要的时候可以直接调用方法之间是平级的关系 不能在方法里面定义方法方法不调用就不执行 方法的定义 // 方法的定义 /* [修饰符] 返回值类型 方法名称([参数 1],[参数 2]){语句A;return 返回值; } *///…

VT虚拟化框架编写

文章目录前言VT架构基础VT框架编写步骤一:检测VT是否开启VMM和VMVMON和VMCSVT框架编写步骤二 填充VMONVT框架编写步骤三 进入VTVT框架编写步骤四 初始化VMCSVT框架编写步骤五 初始化VMCS数据区VT框架编写步骤六 处理必要事件前言 学习VT相关的知识,需要…

C++11新特性

文章目录说在前面花括号{}初始化new的列表初始化STL相关容器的列表初始化相关语法格式容器列表初始化的底层原理forward_list和array与类型相关的新特性decltype左值引用和右值引用什么是左值,什么是右值左值和右值的本质区别右值引用如何理解右值引用std::move移动…

【软考系统架构设计师】2022下综合知识历年真题

【软考系统架构设计师】2022下综合知识历年真题 【2022下架构真题第01题:绿色】 01.云计算服务体系结构如下图所示,图中①、②、③分别与SaaS、PaaS、Iaas相对应,图中①、②、③应为( ) A.应用层、基础设施层、平台层 B.应用层、平台层、基础…

Linux驱动开发(一)

linux驱动学习记录 一、背景 在开始学习我的linux驱动之旅之前,先提一下题外话,我是一个c语言应用层开发工作人员,在工作当中往往会和硬件直接进行数据的交互,往往遇到数据不通的情况,常常难以定位,而恰巧…

静态分析工具Cppcheck在Windows上的使用

之前在https://blog.csdn.net/fengbingchun/article/details/8887843 介绍过Cppcheck,那时还是1.x版本,现在已到2.x版本,这里再总结下。 Cppcheck是一个用于C/C代码的静态分析工具,源码地址为https://github.com/danmar/cppcheck …

Python之字符串精讲(上)

前言 字符串是所有编程语言在项目开发过程中涉及最多的一个内容。大部分项目的运行结果,都需要以文本的形式展示给客户,曾经有一位久经沙场的老程序员说过一句话:“开发一个项目,基本上就是在不断的处理字符串”。下面对Python中…

自命为缓存之王的Caffeine(3)

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~缓存的存储空间是远远小于磁盘的。所以对于有些过期的数据,就需要定期进行清理,腾出存储空间。Caffeine又是怎么做的呢?Caffei…

SpringBoot+Vue在线小说系统

简介:本项目采用了基本的springbootvue设计的在线小说系统。详情请看截图。经测试,本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 特别说明:本系统设计网络爬虫,遵循爬虫规则,此项目用于学习&a…

2023关键词:挑战

未失踪人口回归… 好久不见,不经意间拖更2个多月。今天周末,外面淅淅沥沥下着小雨,这种窝在床上的时刻最适合写点东西了。 但是建议大家在办公或者写博客的时候尽量还是端正坐姿,我就是因为喜欢这样靠在床背上,长时间…

Spring Security 从入门到精通

前言 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与Spr…

Vue3+ElementPlus+koa2实现本地图片的上传

一、示例图二、实现过程利用Koa2书写提交图片的后台接口这个模块是我写的项目中的其中一个板块——上传图片,这个项目的后台接口主要是是使用了后端的Koa2框架,前端小伙伴想要试着自己书写一些增删改查的接口可以从这个入手,Koa2用来了解后端…

力扣HOT100 11-15

11.盛水最多的容器 思路:最大水量 底边 * 高度。较短的一边控制最大水量,因此,采用双指针的方式,左、右指针指向开始和末尾,逐个向中间移动,判断左右指针所指向的高度哪个更低,它就向中间移动一…

ubuntu中解决Failed to connect to 127.0.0.1 port xxxxx: Connection refused

ubuntu中解决Failed to connect to 127.0.0.1 port xxxxx: Connection refused 方法一 查看一下代理 git config --global http.proxy git config --global https.proxy 有就取消,没有就换一种方法 git config --global --unset http.proxy git config --global --unse…

计算机网络之http03:HTTPS RSA握手解析

不同的秘钥交换算法,握手过程可能略有差别 上文对HTTPS四次握手的学习 SSL/TLS Secure Sockets Layer/Transport Layer Security 协议握手过程 四次通信:请求服务端公钥 2次 秘钥协商 2次 (1)ClientHello请求 客户端向服务端发送client…

状态机设计举例

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。 🔥文章和代码已归档至【Github仓库&#xf…

JavaScript内置支持类Array

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>内置支持类Array</title> </head> <body bgcolor"antiquewhite"> <script type"text/javasc…

【Spark分布式内存计算框架——Spark Core】8. 共享变量

第七章 共享变量 在默认情况下&#xff0c;当Spark在集群的多个不同节点的多个任务上并行运行一个函数时&#xff0c;它会把函数中涉及到的每个变量&#xff0c;在每个任务上都生成一个副本。但是&#xff0c;有时候需要在多个任务之间共享变量&#xff0c;或者在任务(Task)和…

T35,没有token是什么意思?

描述 输入一个升序数组 array 和一个数字S&#xff0c;在数组中查找两个数&#xff0c;使得他们的和正好是S&#xff0c;如果有多对数字的和等于S&#xff0c;返回任意一组即可&#xff0c;如果无法找出这样的数字&#xff0c;返回一个空数组即可。 数据范围: 0≤len(array)≤…