再来两个小问题

简介: 再来两个小问题

先上代码:


function foo(){
  if (false) {
    function foo() {
      return 2;
    }
  }
console.log(foo());
}
foo(); 复制代码

以上代码会输出什么呢?


答案是foo is not a function


以上代码可以解释为如下代码:


function foo(){
  let foo;
  if (false) {
    foo = function() {
      return 2;
    }
  }
console.log(foo());
}
foo(); 
复制代码


因为函数声明在条件为假的if语句里边,所以这个时候只是函数声明的提升,而并没有初始化该函数,所以此时foo是undefined,把它当做函数调用报错 is not a function。


再来看另一个有意思的问题,代码如下:


let s = {
  a: function() {
      console.log(this);
  },
  b() {
      console.log(this);
  }
}
let foo = s.a.bind(this),
bar = s.b.bind(this);
console.log(new foo());
console.log(new bar());
复制代码


以上代码又会输出什么呢?


答案是如下:


a {}
a {}
TypeError: bar is not a constructor复制代码


这里涉及到一些new做了什么,简单讲


1. 创建一个新对象


2. 执行构造函数的代码,并将this绑定到新创建的对象


3.将新创建对象的__proto___连接到构造函数的prototype


4.如果构造函数没有返回一个对象,则返回这个新创建的对象


基于此,也就理解了打印的两个a一个是执行构造函数代码时的console.log,一个是new 操作符的返回值,接下来要思考的是为什么new bar()的时候报错了呢?


这是因为ES6属性名简写的函数和箭头函数都是没有prototype的,所以会报错bar不是构造函数,那么为什么会这样设计呢?


这是因为属性名简写的函数作为一个对象的方法,而箭头函数在声明的时候就绑定了this,都不会作为构造函数来使用,而且ES6提倡大家放弃对构造函数的使用,而采用Class来实现继承。


如果有错误或者不严谨的地方,请给予指正,十分感谢!


相关文章
|
安全 前端开发 JavaScript
前端(十六)——Web应用的安全性研究
前端(十六)——Web应用的安全性研究
252 0
|
12月前
|
存储
华为机试HJ64:MP3光标位置
华为机试HJ64:MP3光标位置
|
JavaScript 前端开发
Vue.js事件修饰符及v-model双向数据绑定
Vue.js事件修饰符及v-model双向数据绑定
150 0
|
分布式计算 Hadoop Java
linux expect 自动交互脚本用法
linux expect 自动交互脚本用法
3705 0
|
自然语言处理 算法 开发者
为了让天猫精灵“说人话”,阿里工程师做了哪些事?
天猫精灵是阿里巴巴人工智能实验室出品的智能音箱,在推出不久就迅速占领国内市场,将人工智能以开口即得的方式带入千家万户。它不仅能帮你播放音乐、查时间、了解天气还能帮你交话费、开灯、调整空调温度。今天,我们探究这只“猫”的内部结构——对话引擎,了解它如何实现与人对话。
2594 0
|
Web App开发 JavaScript 前端开发
一起谈.NET技术,参数编码 完全解决方案
参数编码规范 一.摘要 我们经常要在页面传递中文数据,但是往往被文字编码所困惑.有时不了解到底是浏览器编码问题还是服务器编码问题.本文分析了互联网传递数据的编码原理, 并且提出了完善易用的解决方案. 二.
1146 0
|
存储 算法 C#
使用 MNIST 图像识别数据集
下载代码示例 机器学习领域中最迷人的主题之一是图像识别 (IR)。 使用红外系统的示例包括使用指纹或视网膜识别的计算机登录程序和机场安全系统的扫描乘客脸寻找某种通缉名单上的个人。
1450 0
x3d
|
存储 Web App开发 数据安全/隐私保护
再探OAuth2
原文: http://www.cnblogs.com/Irving/p/4134629.html web:http://oauth.net/2/ rfc: http://tools.ietf.org/html/rfc6749 doc:http://oauth.net/documentation/ code:http://oauth.net/code/ 什么是OAuth2.0 OAuth2.0是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密的资源(如用户个人信息、照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。
x3d
1236 0
|
16天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇