首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么首先返回函数,因为提升的变量应该在作用域之上,在我的例子中是函数?

首先返回函数是因为在JavaScript中,函数声明会被提升到作用域的顶部,这意味着无论函数声明在代码中的哪个位置,它都可以在其被声明之前被调用。

在给出具体解释之前,让我们先了解一下JavaScript中的变量提升。变量提升是指在代码执行之前,JavaScript引擎会将变量和函数声明提升到当前作用域的顶部。这意味着我们可以在声明之前使用这些变量和函数。

在你提供的例子中,首先返回函数的原因是因为函数声明会被提升到作用域的顶部。这意味着无论函数声明在代码中的哪个位置,它都可以在其被声明之前被调用。

例如,考虑以下代码:

代码语言:txt
复制
console.log(myFunction()); // 输出 "Hello"

function myFunction() {
  return "Hello";
}

在这个例子中,我们在调用myFunction()之前定义了函数。这是因为函数声明会被提升到作用域的顶部,所以我们可以在声明之前调用函数。

这种行为对于编写可读性和可维护性更好的代码非常重要。通过将函数声明放在作用域的顶部,我们可以更容易地理解代码的执行顺序。

需要注意的是,只有函数声明会被提升,而函数表达式不会被提升。函数表达式是将函数赋值给变量或常量的方式。例如:

代码语言:txt
复制
console.log(myFunction()); // 抛出错误,myFunction不是一个函数

var myFunction = function() {
  return "Hello";
};

在这个例子中,我们尝试在函数表达式被赋值之前调用myFunction(),这会导致错误。因为函数表达式不会被提升,所以在赋值之前调用函数会导致变量为undefined,并且不能被调用为函数。

总结起来,首先返回函数是因为函数声明会被提升到作用域的顶部,这使得我们可以在函数声明之前调用函数。这种行为对于编写清晰、易读的代码非常有帮助。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

最失败 JavaScript 面试问题

变量作用 这个主题值得探讨,不仅因为它在面试很受欢迎,而且还有实际应用原因。如果你能很好地理解变量作用,那么你将节省大量调试代码时间。 让我们看一些常见例子。...解释: 命名函数表达式,名称只函数体内部局部,外部无法访问。因此,全局作用域中不存在foo。 typeof运算符对未定义变量返回undefined。...解释 导入会被提升提升JS一种机制,其中变量函数声明代码执行之前被移动到它们作用顶部。 所有依赖项将在代码运行之前加载。...解释 函数变量声明被放在其作用顶部,变量初始化发生在脚本执行时。 具有相同名称变量重复声明将被跳过。 函数总是首先提升。...无论函数和具有相同名称变量声明代码以何种顺序出现,函数都优先,因为它上升得更高。

15520

JS执行上下文两个阶段做了些啥?

每当脚本浏览器中加载时,堆栈第一个元素就是全局执行上下文。然而,当一个函数执行时,将创建一个执行上下文,并将其虚拟放置全局执行上下文之上。...创建 执行 创建阶段 函数创建时做三件事: 1.首先,为用链内每个函数变量构建到外部环境连接。告诉执行上下文它应该包含什么,以及它应该在哪里查找解析函数引用和变量方法。...执行开始时,JS 引擎在其创建阶段对象寻找执行函数引用。如果不能在自己作用内找到它,它将继续向上查找,直到到达全局环境。 如果在全局环境没有找到引用,它将返回一个错误。...这就是咱们所说变量提升,即所有使用var变量声明都被提升它们局部作用(函数内部声明)或者全局作用顶部(函数外部声明)。 执行阶段,完成变量分配。...作用函数执行上下文创建时候定义好,不是函数执行时候定义。 2.什么作用链 当一个块或者函数嵌套在另一个块或函数时,就发生了作用嵌套。

66120

什么Javascript提升

深入讨论任何“提升(hoisting)”定义之前,先举个例子 -- 定义一个函数并调用: function cowSays(sound){ console.log(sound); } cowSays...真正发生事情,在编译阶段,函数变量声明就被加入内存了。 在上面的例子,正因为这个原因,才能在其代码出现位置之前就访问或调用那个函数。...console.log(a); var a = 3; // undefined 嗯,这个例子第一次出乎我们预料。预想3没有打印出来,却成了 undefined。 为什么会这样?...事实上,以上代码等效于: var a; console.log(a); a = 3; // undefined 最佳实践: 因为提升原因,公认最佳实践:总是在其作用顶端声明变量函数。...这种方法没有不良作用。 并且,总是应该在定义了变量后就初始化它们,这将提供清晰代码,并避免 undefined 出现。

78130

JS到底怎么执行:一文彻底搞清执行上下文

这些阶段: 创建变量对象(VO) 创建作用链 为变量赋值 创建阶段:创建变量对象(VO) 变量对象(VO)一个执行上下文中创建类对象容器。它存储了执行上下文中定义变量函数声明。...这种作用概念在JavaScript引发了一种称为闭包关联现象,即:闭包可以使我们函数外部访问到函数内部变量。 让我们看一些例子来更好地理解: 右边全局作用。...绿色second()函数作用。有一个console.log语句,用于打印变量a、b和c。 现在变量a和b没有second()函数定义,只有c。...也就是说,全局作用永远不能访问内部函数变量,除非它们从函数返回。 打个比方:作用链就像隐私玻璃。你可以看到外面,但是外面的人看不到你。...这就是为什么上图中红色箭头指向上方因为这是作用唯一方向。 创建阶段:设置“this”关键字执行上下文创建阶段确定作用之后,下一个也是最后一个阶段设置this关键字值。

1.2K60

编程语言中变量作用与闭包

,Javascript 为什么变量提升这里不仅仅是介绍what,更重要why,要知道这两门语言设计者都是深耕CS领域多年老手,不会轻易犯错,肯定有“不为人知”一面,但遗憾网上大部分文章就是解释...、Ruby等)只具有函数级别(function level)变量作用 dynamic scope vs. static scope 首先声明一点,这里dynamic与static变量作用...执行 foo 函数时,变量查找顺序这样首先在 E1 中找到,找不到就会去其外围环境中去查找;找到则直接返回 E1外围环境查找,如果找到直接返回,如果找不到则再在外围环境外围环境中继续查找...究其原因,就是因为每个item click 所对应回调函数声明与执行分开,而且 Javascript 只有 function level 作用,所以单击Item时环境这样...foo) { foo = 10; } alert(foo); } bar(); 上面这个例子就简单演示了什么变量提升,下面重点讲述为什么要这么设计?

49720

看完这几道 JavaScript 面试题,让你与考官对答如流(上)

具体更多规则可以对参考之前文章: 对 JS 相等和全等操作符转化过程一直很迷惑,直到有了这份算法 15. 为什么 JS 中比较两个相似的对象时返回 false?...提升用来描述变量函数移动到其(全局或函数)作用顶部术语。 为了理解提升,需要来了解一下执行上下文。执行上下文当前正在执行“代码环境”。执行上下文有两个阶段:编译和执行。...什么作用? JavaScript 作用我们可以有效访问变量函数区域。JS 有三种类型作用:全局作用函数作用和块作用(ES6)。...全局作用——全局命名空间中声明变量函数位于全局作用域中,因此代码任何地方都可以访问它们。...闭包就是一个函数声明时能够记住当前作用、父函数作用、及父函数作用变量和参数引用,直至通过作用链上全局作用,基本上闭包声明函数时创建作用

2K10

8个在学习React之前必须要了解JavaScript功能

1、Let和Const ES6引入了let,const用于声明变量以代替var。let与const相比有许多优势。 第一个优点它们具有一个块作用,这意味着它们不能在该块作用之外访问。...这就是为什么我们会得到一个错误提示。 因此,这非常有用,因为有时var,可以使用关键字更改变量而你不会注意到它。 另一个优点let与const他们没有提升到像关键字文件顶部var。...3、解构 销毁你需要了解重要ES6功能之一。它在React代码上使用了很多。这就是为什么你应该了解它。 它允许你复制对象或数组一部分并将其放入命名变量。...6、高阶函数 高阶函数将另一个函数作为参数任何函数JavaScript,可以使用许多有用高阶函数。map,filter和reduce会是你React中大量使用到函数。...8、三元运算符 三元运算符,JavaScript编写条件语句一种简便方法。 注意到大多数时候,使用三元运算符有条件地React渲染事物。

1.3K20

JS 到底干嘛:一文搞懂JS 执行上下文

这些阶段: 创建变量对象(VO) 创建作用链 为变量赋值 创建阶段:创建变量对象(VO) 变量对象(VO)一个执行上下文中创建类对象容器。它存储了执行上下文中定义变量函数声明。...这种作用概念在JavaScript引发了一种称为闭包关联现象,它能让变量函数私有化。 让我们看一些例子来更好地理解: 右边全局作用。...绿色second()函数作用。有一个console.log语句,用于打印变量a、b和c。 现在变量a和b没有second()函数定义,只有c。...也就是说,全局作用永远不能访问内部函数变量,除非它们从函数返回。 打个比方:作用链就像隐私玻璃。你可以看到外面,但是外面的人看不到你。...这就是为什么上图中红色箭头指向上方因为这是作用唯一方向。 创建阶段:设置“this”关键字执行上下文创建阶段确定作用之后,下一个也是最后一个阶段设置this关键字值。

29410

从来不理解JavaScript闭包,直到有人这样向我解释它

这是参与「掘金日新计划 · 10 月更文挑战」第29天,点击查看活动详情 为什么需要闭包 首先我们来看一下为什么需要闭包。...按照之前说法,这个 food 变量应该当 eat 函数调用完后就销毁,后续为什么还能通过调用 look 方法访问到这个变量呢? 这就是因为闭包起了作用。...正因为作用存在,所以能够通过作用链来访问到外部函数变量。 (2)为什么当外部函数上下文执行完以后,其中局部变量还是能通过闭包访问到呢?...其实用上一个问题答案再延伸一下,这个问题答案就出来了。 介绍作用时候,我们有介绍过作用函数创建时候就确定下来了(参阅《作用》章节)。...局部变量本来应该在函数退出时被解除引用,但如果局部变量被封闭闭包形成环境,那么这个局部变量就能一直生存下去。也就是说,闭包会将局部变量保存下来。

31350

你不知道JavaScrpit(上卷) 随记(一)

找不到会抛出一个异常 LHS 与 RHS LHS: 变量出现在赋值操作左侧(试图找到变量容器本身) RHS: 变量出现在右侧(其实就是查询取到这个变量源值) 为什么区分LHS和RHS很重要: 因为变量还没声明时这两种查询行为不同...词法作用意味着作用由书写代码函数声明位置决定。编译词法分析阶段基本能够知道全部标识符在哪里以及如何声明,从而能预测执行过程如何对它进行查找。...引擎会在解释js代码之前首先对其进行编译。编译第一部分工作就是找到所有的声明,并用合适作用将他们关联起来。所以,包括变量函数在内所有声明都会在任何代码被执行之前首先被处理。...然后我们将bar()函数本身当作一个值类型进行传递。在这个例子我们把bar所引用函数对象本身当作返回值。...foo()执行后,其返回值(其实也就是内部bar()函数)赋值给baz并调用baz(), 实际上只是通过不同标识符引用调用了内部函数bar() 这个例子,bar自己定义词法作用以外地方执行

83641

Conscript_const let var

这表明函数内部变量i与循环变量i不在同一个作用,有各自单独作用。 不存在变量提升 var命令会发生“变量提升”现象,即变量可以声明之前使用,值为undefined。...因为块级作用内声明函数类似于let,对作用之外没有影响。但是,如果你真的 ES6 浏览器运行一下上面的代码,会报错,这是为什么呢?...允许块级作用内声明函数函数声明类似于var,即会提升到全局作用函数作用头部。 同时,函数声明还会提升到所在块级作用头部。...根据这三条规则,浏览器 ES6 环境,块级作用内声明函数,行为类似于var声明变量。上面的例子实际运行代码如下。...这样设计带来了几个很大问题,首先是没法在编译时就报出变量未声明错误,只有运行时才能知道(因为全局变量可能顶层对象属性创造,而属性创造动态);其次,程序员很容易不知不觉地就创建了全局变量

38020

如何修复Vue “this is undefined” 问题

一个可能原因混淆了常规函数和箭头函数用法,如果你遇到这个问题,猜你用箭头函数。如果用常规函数替换箭头函数,它可能会为你修复这个问题。 我们再深入一点,试着理解为什么会这样。...下面使用匿名函数一些场景 使用 axios 或 fetch 访存数据 filter、map和reduce等函数方法 Vue 方法任何地方 来个例子看一下: // Fetching data...什么词法作用 如前所述,常规函数和箭头函数之间存在差异主要原因与词法作用有关。来分析一下它含义。 首先作用程序存在变量任何区域。...Javascript,window 变量具有全局作用,它在任何地方都可用。尽管大多数变量被限制定义它们函数、它们所属类或模块。 其次,单词“词法”仅仅意味着作用由你如何编写代码决定。...作用如何在函数工作 下面一些示例,它们演示了作用如何在这两种函数类型之间以不同方式工作 // 此变量 window 作用内 window.value = 'Bound to the window

4.8K20

你真的懂let和const吗?

块级作用 ES6之前我们脑海里应该只存在全局作用函数作用,没有块级作用。那么为什么要引入块级作用呢?... } } d();//undefined 相信很多刚入门同学看到上述代码会有所不解,其实在全局作用str变量已经被声明且复制,为什么函数里面访问不到呢。...这里就牵扯到变量提升函数作用概念。上述代码其实等同于下放代码,当函数被执行时候生成了一个新作用也就是函数作用,js引擎会把变量声明提到方法体最前面,大家可以看到只是声明了并没有赋值。...(str[i]); } console.log(i); // 5 es6let和const声明符,不存在变量提升;同时也只块级作用生效。...let和const声明不会被提升,所以为了保障声明有效性,js解释引擎会对变量所处块级作用形成一种保护,因此声明之前使用会有语法错误,不被允许

822110

你真的懂let和const吗?

块级作用 ES6之前我们脑海里应该只存在全局作用函数作用,没有块级作用。那么为什么要引入块级作用呢?...} } d();//undefined 相信很多刚入门同学看到上述代码会有所不解,其实在全局作用str变量已经被声明且复制,为什么函数里面访问不到呢。...这里就牵扯到变量提升函数作用概念。上述代码其实等同于下放代码,当函数被执行时候生成了一个新作用也就是函数作用,js引擎会把变量声明提到方法体最前面,大家可以看到只是声明了并没有赋值。...(str[i]); } console.log(i); // 5 es6let和const声明符,不存在变量提升;同时也只块级作用生效。...let和const声明不会被提升,所以为了保障声明有效性,js解释引擎会对变量所处块级作用形成一种保护,因此声明之前使用会有语法错误,不被允许

70360

75个JavaScript面试题集锦,内含解答,自测 JS 掌握程度

提升用来描述变量函数移动到其(全局或函数)作用顶部术语。 为了理解提升,需要来了解一下执行上下文。执行上下文当前正在执行“代码环境”。执行上下文有两个阶段:编译和执行。...什么作用? JavaScript 作用我们可以有效访问变量函数区域。JS 有三种类型作用:全局作用函数作用和块作用(ES6)。...全局作用——全局命名空间中声明变量函数位于全局作用域中,因此代码任何地方都可以访问它们。...闭包就是一个函数声明时能够记住当前作用、父函数作用、及父函数作用变量和参数引用,直至通过作用链上全局作用,基本上闭包声明函数时创建作用。...闭包只是函数记住其当前作用,父函数作用和全局作用变量引用能力。当我们全局作用内使用var关键字声明变量时,就创建全局变量i。

13K94

前端面试题合集

图片因为通常情况下,函数内部变量无法在外部访问(即全局变量和局部变量区别),因此使用闭包作用,就具备实现了能在外部访问某个函数内部变量功能,让这些内部变量值始终可以保存在内存。...当然这个理解建立 Chrome 表现之上不同浏览器上因为引擎不同,可能存储方式还是有所变化。闭包产生原因我们在前面介绍了作用概念,那么你还需要明白作用基本概念。...其实很简单,当访问一个变量时,代码解释器会首先在当前作用查找,如果没找到,就去父级作用去查找,直到找到该变量或者不存在父级作用域中,这样链路就是作用链需要注意,每一个子函数都会拷贝上级作用...因为在当前环境,含有对 fun2 函数引用,fun2 函数恰恰引用了 window、fun1 和 fun2 作用。因此 fun2 函数可以访问到 fun1 函数作用变量。...,这是因为函数变量提升原因。

74820

为什么 Julia 速度这么快?

接受抽象类型作为参数函数无法知道元素类型(在这个例子,元素要么浮点数,要么整数),这个时候,多重分派优化在这里起不到作用,所以 Julia 此时性能就不如其他脚本语言。...第 5 行我们放置显式转换调用地方,这样我们就确定了问题所在位置。 处理必要类型不稳定性 首先已经证明了某些 Julia 会出错函数在其他脚本语言中却可以 “读懂你想法”。...REPL 全局作用性能很糟糕 Julia 全局作用性能很糟糕。官方性能指南建议不要使用全局作用。然而,新手可能会意识不到 REPL 其实就是全局作用为什么?...首先,Julia 有嵌套作用。例如,如果函数内部有函数,那么内部函数就可以访问外部函数所有变量。...test2 ,y 已知因为它是 test 定义

2.3K10

70个JavaScript面试问题

提升用来描述变量函数移动到其(全局或函数)作用顶部术语。 为了理解提升,需要来了解一下执行上下文。执行上下文当前正在执行“代码环境”。执行上下文有两个阶段:编译和执行。...什么作用? JavaScript 作用我们可以有效访问变量函数区域。JS 有三种类型作用:全局作用函数作用和块作用(ES6)。...全局作用——全局命名空间中声明变量函数位于全局作用域中,因此代码任何地方都可以访问它们。...闭包就是一个函数声明时能够记住当前作用、父函数作用、及父函数作用变量和参数引用,直至通过作用链上全局作用,基本上闭包声明函数时创建作用。...闭包只是函数记住其当前作用,父函数作用和全局作用变量引用能力。当我们全局作用内使用var关键字声明变量时,就创建全局变量i。

1.4K10

Vue学习笔记之Vue学习前准备工作

然后代码块之外调用这两个变量,结果let声明变量报错,var声明变量返回了正确值。这表明,let声明变量它所在代码块有效 for循环相信大家都玩过。...这是因为 JavaScript 引擎内部会记住上一轮循环值,初始化本轮变量i时,就在上一轮循环基础上进行计算 0x03 不存在变量提升 var命令会发生”变量提升“现象,即变量可以声明之前使用,...变量bar用let命令声明,不会发生变量提升。这表示声明它之前,变量bar不存在,这时如果用到它,就会抛出一个错误。...0x04 不允许重复声明  let不允许相同作用内,重复声明同一个变量。...ES5 只有全局作用函数作用,没有块级作用,这带来很多不合理场景。

50430
领券