javaScript基础面试题 ---this指向+原型的考题

2023-10-27

function Foo() { 
	getName = function () {
		console.log(1) 
	}
	return this;
}

Foo.getName = function(){console.log(2)}
Foo.prototype.getName = function () { console.log(3)}
var getName = function () { console.log(4) }
function getName() { 
	console.log(5)
}

Foo().getName();//1
getName();//1

结果为1,1

我一开始也觉得离谱,懂了之后就恍然大悟

解析:
1、首先是Foo().getName();这句
拆开来看,先执行Foo()
Foo干了什么事呢?
getName = function () {console.log(1) }
注意这个getName前面没有var,所以这是个全局变量,window下的
然后Foo return了this,这个普通函数的this指向的是window
所以这句话也可以是window.getName()
window.getName()原来是打印4,但是被Foo的1覆盖了,所以是1
2、getName();这句
还是window下的getName,还是1

在JavaScript中,函数的this值取决于函数调用的上下文。对于普通函数(非箭头函数),当函数被调用时,它的this值通常是调用该函数的对象。然而,当函数被直接调用(而不是作为对象的方法调用)时,this值会默认指向全局对象(在浏览器中为window对象)。

提供的代码示例中,函数是直接调用的,没有明确的调用对象。因此,在这种情况下,this值将指向全局对象(在浏览器中为window对象)。


把题稍微改下,还是上面那个题,最后调用函数那两句换成一下:

Foo.getName();//2
getName();//4

输出就是2,4

分析:
Foo.getName()在上面定义好了就是2,也没有被覆盖,因为Foo没有小括号,所以Foo没被调用
下面的getName直接就是4,也没有被覆盖


再把题目稍微改下,还是上面的题,最后调用函数改成:

new Foo().getName();//3

分析:
因为new了一下,所以这个Foo是新的,这个新的Foo身上没有getName,所以去原型链上查找
原型链查找顺序:现在自身查找 -> 构造函数上找 -> 对象原型中找 -> 对象的上一层原型中找
Foo()函数里面的getName = function () {console.log(1)}前面没有this,所以它还是个全局变量,没有挂的元素构造函数Foo()上,所以要去函数原型上找,原型上的是3,所以输出3


接下来看一个新的题:

var o = {
    a:10,
    b:{
        fn:function () { 
            console.log( this.a )
            console.log( this )
         }
    }
}
o.b.fn()

输出为:
undefined
{ fn: [Function: fn] }

分析:
1、 console.log( this.a )分析
b是一个对象,fn是b里面的函数
fn里面的函数是指向拥有它的对象的,也就是b
但是b里面没有a,所以是undefined
如果b里面有a,那么就打印b里面的a
2、console.log( this )分析
this指向的就是b,b里面就是{ fn: [Function: fn] }


function Foo(){
  getName = function(){
      console.log(1);
  };      
  return this;
}                                          
Foo.getName = function(){
  console.log(2);
};  
Foo.prototype.getName = function(){
  console.log(3);
};          
var getName = function(){
  console.log(4);
};              
function getName(){
  console.log(5);
}
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

这个题的答案是: 2 4 1 1 2 3 3

,1、首先是Foo.getName();
答案是2,第二个函数,后面也没有什么能覆盖它的,就是2了

2、getName();
不是4就是5,最后一个函数使用的是函数声明的方式,倒数第二个函数使用的是声明变量的方式,声明变量>函数声明,所以两者共存的时候,优先使用声明变量,所以不是5而是4

3、Foo().getName();
注意第一个函数里面的getName前面没有var ,所以是window下的getName,普通函数内部的this指向的就说window,所以这个调用也等同于window.getName(),刚好是1。还有个疑问,window下的,那为什么不是4或者5呢?本来全局作用域下的应该是4的,不是5,说了变量声明>函数声明,但是调用了this.getName()之后,全局getName就被覆盖成1了

4、getName();
这里还是1,刚刚说被覆盖了

5、new Foo.getName();
实际上是new (Foo).getName(),在new Foo的时候,Foo没有getName方法,所以直接调用Foo上的静态方法,结果为2

6、new Foo().getName();
带()的会继承原型链上的方法,5中不带括号的不继承原型链,所以直接输出2,这里直接输出3
new Foo.getName();
这个表达式等同于 (new Foo).getName();。这里,new Foo 创建了一个新的 Foo 实例,但是,我们并没有调用该实例上的 getName 方法。实际上,我们正在访问 Foo 函数上的静态方法 getName,因此我们直接调用了 Foo.getName,输出 2。
new Foo().getName();
在这个表达式中,我们首先使用 new Foo() 创建了一个新的 Foo 实例。这个实例从 Foo.prototype 继承了 getName 方法。因此,当我们调用 new Foo().getName(); 时,我们实际上调用了从 Foo.prototype 继承的 getName 方法,输出 3。


  • 代码题: 看代码说结果, 一个关于 this 指向的
var a = 1;
var obj = {
  a: 2,
  console() {
    function fn() {
      console.log(this.a);
    }
    fn();
  }
};

obj.console(); // 问输出什么? -- 严格模式是Undefined,非严格模式是1

在此代码中,obj.console() 被调用时,内部的 fn 函数是在全局上下文中被调用的(不是作为对象的方法被调用,而是作为普通函数被调用),所以 thisfn 函数内部指向全局对象。

在浏览器环境中,全局对象是 window,而 var a = 1; 是在全局范围内定义的,所以 this.afn 中就相当于 window.a,它的值为 1

所以,obj.console(); 的输出是 1

如果这段代码在严格模式下('use strict';)执行,this 将会是 undefined,并且尝试访问 this.a 会抛出一个错误。但在这个提供的非严格模式的示例中,输出是 1


为什么带()的继承原型链,不带()不继承?

这个解释与 JavaScript 的运算符优先级有关。在 JavaScript 中,new 关键字的优先级高于成员访问(.)。因此,表达式 new Foo.getName()new Foo().getName() 会有不同的执行顺序。

new Foo.getName();

这个表达式的解析顺序是这样的:

  1. Foo.getName 被评估为 Foo 函数对象上的 getName 方法。
  2. 使用 new 运算符调用该方法,即 new (Foo.getName)()

由于 Foo.getName 已经被定义为输出 2 的函数,所以结果是 2。

new Foo().getName();

这个表达式的解析顺序是:

  1. 首先,new Foo() 创建了一个新的 Foo 实例。由于使用了 newthis 指向新创建的对象,该对象继承自 Foo.prototype
  2. 然后,我们在新对象上调用 getName 方法。由于对象从 Foo.prototype 继承,它将使用在 Foo.prototype 上定义的 getName 方法,即 console.log(3),所以结果是 3。

总结:区别在于运算符优先级和表达式的解析顺序。不带括号的版本解析为对 Foo.getNamenew 调用,而带括号的版本则创建一个新的 Foo 实例,然后在该实例上调用 getName。这两者的差异导致了不同的输出。

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

javaScript基础面试题 ---this指向+原型的考题 的相关文章

  • Angular $http.get:如何捕获所有错误?

    我发送一个表单到nodejs进行身份验证 使用 http get在以下函数中并添加promise gt then 在生产中 这是否可以处理我可能从服务器收到的所有错误 我还需要向此功能添加其他内容吗 MyApp controller Log
  • 在使用 jQuery 拖动时向元素添加 CSS 类

    是否可以在元素被拖动到特定区域时向其添加 CSS 类 并在元素被删除后替换该类 我并不是到处寻找这个功能 而是只在特定区域寻找这个功能 是的 这当然有可能 jQuery UI 提供了一些方便的选项和事件来执行此操作 对于初学者来说 可拖动元
  • Redux 状态在窗口重新加载时重置(客户端)

    我有非常大且复杂的对象 例如 userInfo chatInfo 等 就像具有非常大且嵌套信息的对象和数组一样 每次刷新页面时 我的 React 应用程序都会重置 redux 状态 我必须再次调用所有这些 API 我对这个主题做了一些研究
  • ScrollTop 在 Chrome/Safari 中不起作用

    我的网站上有一个循环内的表单 当有人提交表单时 查询字符串会添加到 URL 中 例如 updated 111 然后 我的 JQuery 脚本检查数字的 url 并在提交表单并重新加载页面后滚动到该 div 该脚本在 Firefox 中运行良
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • 如何使用 console.log 省略文件/行号

    如今 您可以在 Chrome 的控制台中编写非常好的东西 查看this https developer chrome com devtools docs tips and tricks关联 我也做了一个截图 正如您在屏幕截图中看到的那样 文
  • 使用 Javascript 对象模型在 SharePoint 任务上设置“分配给”

    我想创建一个共享点任务并将其分配给我自己 当前用户 在 javascript 对象模型中 我有下面的代码 但我认为我需要设置 spusercollection 对象 而不是设置特定用户 但是 我似乎无法在任何地方找到如何执行此操作的任何示例
  • 内联执行生成的汇编程序

    我正在阅读以下演示文稿 http wingolog org pub qc 2012 js slides pdf http wingolog org pub qc 2012 js slides pdf其中讨论了 4 10 19 内联 ASM
  • 无法提取 Typescript 中的对象值

    我一直在尝试将 JavaScript Web 表单转换为 Typescript 但无法弄清楚如何处理以下内容 在 JavaScript 中有效 let fieldValues JSON parse cookieData let keys O
  • React JS“this”没有按预期工作

    我有下面的代码 save function var this this console log this refs itemText this setState isEditing false function console log In
  • 标记内的值发生变化时调用函数

    JavaScript 有没有什么方法可以在段落标记的值更改时调用函数 概述 HTML p 00 00 p
  • Backbone.js 应用程序可以逐步增强并可供搜索引擎抓取吗?

    我需要为我的下一个项目实现一个 MVC JavaScript 框架 但它既是一个网站 又是一个 Web 应用程序 是否可以公开数据服务器端 然后解析 URL 以显示 JS 版本 我计划使用 Rails 作为服务器端代码 我写了一个关于这个主
  • jQuery 如何通过不同的列值计算表中的行数

    如何按表列计算不同的表行 Example table thead tr th NAME th th TECHNOLOGY th tr thead tbody tr td john td td jQuery td tr tr td mark
  • D3 时间解析返回 null

    根据此页面上的说明 https github com mbostock d3 wiki Time Formatting https github com mbostock d3 wiki Time Formatting我正在尝试解析 ISO
  • 如何与使用 child_process.spawn 创建的新创建的服务器交互

    我正在尝试为我的私人托管的 反恐精英全球攻势 服务器制作一个前端 当我点击运行服务器时 在前端 一切正常 服务器启动并记录到控制台 但是如何查看服务器IP地址 服务器中的玩家等信息呢 这是我到目前为止运行服务器的内容 router post
  • 加载 angularjs 路由后运行 javascript 代码

    我需要在 angularjs 加载路线后显示警报 显示警报的代码位于 angularjs 异步加载的视图中 视图加载后 我希望它能够运行 但它没有 我知道我可以广播并告诉它稍后运行等 但我需要一个更通用的解决方案 假设您正在谈论基于以下内容
  • Firefox 和 Chrome 为 offsetTop 提供了不同的值

    我试图相对于输入字段定位一个跨度元素 让我们称之为 工具提示跨度 为此 我将工具提示跨度和输入字段包装在另一个跨度元素中 我们称之为 包装器跨度 该元素具有position relative 然后我设置position absolute在工
  • 检测图像是否损坏或损坏

    我需要以编程方式检查用户在我的应用程序上选择作为壁纸的图像是否已损坏或损坏 基本上我为用户提供了选择自己的图像作为壁纸的选项 现在 当图像加载时 我只想检查它是否已损坏 如果您正在寻找 PHP 解决方案而不是 javascript 解决方案
  • 使用 Three.js 中的设备方向控件进行对象旋转

    我正在迈出使用 JavaScript 进行编码并使用 Three js 的第一步 我正在尝试 Threejs org 的这个例子 http trijs org examples misc controls deviceorientation

随机推荐

  • 链表与节点

    链表 java中通过 node next 表示 node的下一个节点 同理 node next next 表示 node后的第二个节点 通过链表这种数据结构 可以实现许多奇妙的组合 这里我通过接口的方式 把重要的方法进行了封装 虽然只有三个
  • 逆流而上——泛谈对二进制可执行程序的静态反编译

    欢迎对本blog相关主题感兴趣的团体或单位转载相关文章 但转载时请注明出处 谢谢 一 概述 首先应该声明的是 这里讨论的反编译是针对二进制可执行程序进行的静态反向编译操作 虽然对于类似Java Bytecode和MSIL的虚拟机中间代码的反
  • 【layui】 灵活使用弹出层iframe 让你的父界面代码更加清晰

    第一次使用layui框架时候 layer open 使用了最最累赘的 静态布局div 在写入content中不但让你的代码逻辑很乱 而且不利于开发 所以整理一款 弹出层js 是在开发中必不可少的 在此感谢 X admin2 0 提供的源码
  • python实现次梯度(subgradient)和近端梯度下降法 (proximal gradient descent)方法求解L1正则化

    l1范数最小化 考虑函数 显然其在零点不可微 其对应的的次微分为 注意 的取值为一个区间 两个重要定理 1 一个凸函数 当且仅当 为全局最小值 即 为最小值点 2 为函数 不一定是凸函数 的最小值点 当且仅当在该点可次微分且 考虑最简单的一
  • scrapy爬取王者官网壁纸

    1 安装scrapy pip install scrapy pip install Pillow 2 创建项目 scrapy startproject wangzhe cd wangzhe scrapy genspider wz xxx 3
  • 蓝牙定位技术原理--蓝牙人员定位--蓝牙定位--新导智能

    众所周知 蓝牙通讯技能被广泛用于手的机 智能家居 智能穿戴等通讯中 随着物联网生态链逐渐走向成熟 对定位的需求也大大增加 这给蓝牙在该范畴又发明了一番宽广的六合 接下来首要剖析一下蓝牙定位技能的作业原理与首要使用场景 一 蓝牙人员定位原理
  • K8S master高可用,多master节点 (keepalived + haproxy)案例

    说明 Apiserver是用户和 kubernetes 集群交互的入口 封装了核心对象的增删改查操作 提供了 RESTFul 风格的 API 接口 通过etcd来实现持久化并维护对象的一致性 所以在整个K8S集群中 Apiserver服务至
  • Python实战项目(一)网页虚拟访问程序

    作者 尘世镜花恋 声明 本文章纯属个人学习所作 切勿用于非法渠道 转载请注明原文链接 有一些网站 对于本机用户自身的访问也计入访问量内 所以我们可以利用这一点利用自己的电脑提高自己网页的访问量 这里仅介绍用本机ip访问 首先导入reques
  • 小白_Unity引擎_详细Camera以及代码设置

    Cemera摄像机 Unity主要核心组件之一 显示场景中 摄像机照射部分 是向玩家捕获和显示世界的设备 1 ClearFlags 清除标记 显示背景内容 默认为天空盒子 代码设置 m Camera GetComponent
  • PHP的AES加密,模式为“AES/CBC/PKCS5Padding“,含解密

    加密需要php5版本 php7方法已弃用 AES加密请求数据 加密通过AES加密请求数据 param array query return string public function enAES key input size mcrypt
  • 宝塔误删mysql数据如何恢复?(救命题)

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 mysql二进制日志恢复 有很多朋友私信求帮助恢复数据库 可以加微信备注添加原因 如果能帮助解决问题 给点辛苦费就行 有一个朋友 在工作中 复
  • linux系统使用HTTP代理方法

    在Linux系统中使用HTTP代理方法 可以通过设置环境变量来实现 具体步骤如下 1 打开终端 输入以下命令 export http proxy http 代理服务器IP地址 端口号 其中 代理服务器IP地址和端口号需要替换成你所使用的代理
  • Redis——(3)redis三种启动方式以及其中的使用区别

    目录 1 直接启动 redis server 进入到redis的src文件下 2 通过指定配置文件启动 3 使用redis启动脚本设置开机自启动 4 ssh的安装过程 1 直接启动 redis server 进入到redis的src文件下
  • oracle job的创建和删除

    oracle job的创建 declare v jobnum number begin dbms job submit v jobnum lastjob sysdate last day sysdate 1 COMMIT end 或者 DE
  • Java—内部类

    It s possible to please a class definition within another class definition 内部类即定义在另一个类的内部的类 When you create an inner cla
  • CSS - 纯css实现多行文本溢出省略(兼容所有浏览器)

    这个方式参考了使用了网上流传的方式来解决 是我目前已知的chuncss的最好解决方案 我把网上的又增加了文字两端对齐和 右侧padding 让 更加紧贴文字 对文字形影不离 div class mutil line ellipsis div
  • HASH函数

    散列函数代表除了对称和非对称加密之外的第三种加密类型 我们可以称之为无密钥加密 hash函数就是把任意长的输入位 或字节 变化成固定长的输出字符串的一种函数 输出字符串的长度称为hash函数的位数 哈希不能用于发现原始消息的内容或其任何其他
  • 微服务之间调用的异常应该如何处理

    前言 在分布式服务的场景下 业务服务都将进行拆分 不同服务之间都会相互调用 如何做好异常处理是比较关键的 可以让业务人员在页面使用系统报错后 很清楚的看到服务报错的原因 而不是返回代码级别的异常报错 比如NullException Ille
  • 都是写代码,别人是IT精英,而你只配当程序“猿”?

    热点追踪 深度探讨 实地探访 商务合作 作为新一代信息技术的代表 区块链成为2020年政府工作报告的高频词汇 全国大多数省区市均重点提及到区块链 Part 1 产业区块链袭来 截至目前 在全国29个已召开两会的省 自治区 直辖市 中 区块链
  • javaScript基础面试题 ---this指向+原型的考题

    function Foo getName function console log 1 return this Foo getName function console log 2 Foo prototype getName functio