什么是变量提升?什么是函数提升?

在js中只有两种作用域,全局作用域和函数作用域,在ES6之前,js是没有块级作用域。

JavaScript 代码的执行分为两个阶段。第一个阶段在当前词法环境中注册所有的变量和函数声明,简单说就是,解析,解析完成之后,第二个阶段的 JavaScript 执行就开始了!

JS中创建函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升。

JavaScript 仅提升声明,而不提升初始化。如果你先使用的变量,再声明并初始化它,变量的值将是 undefined。

1:所有的声明都会提升到作用域的最顶上去。

2:同一个变量只会声明一次,其他的会被忽略掉。

3:函数声明的优先级高于变量申明的优先级,并且函数声明和函数定义的部分一起被提升。

变量提升的例子:

num = 6;
var num = 7;
var num;
console.log(num); // 不报错,输出7,也证明了变量只会声明一次,其他的会被忽略。

函数提升的例子:

catName("Chloe");// 即使在声明之前调用依然可以执行,不会报错

function catName(name) {
    console.log("我的猫名叫 " + name);
}

在定义的函数名字和变量名相同的情况下,函数提升优先级高于变量的例子:

func(); // 1
var func;
function func() {
  console.log(1);
}
func = function() {
  console.log(2);
}

输出1,不会输出2。函数声明和变量声明都会被提升,但是需要注意的是函数会先被提升,然后才是变量。

var func;尽管出现在function func()之前,但它是重复的声明,会被忽略,因为函数声明会被提升到普通变量之前。

等同于这样:

function func() {
  console.log(1);
}
func(); // 1
func = function() {
  console.log(2);
}

牢记这三点:

只有声明本身会被提升,而赋值操作不会被提升。

变量会提升到其所在函数的最上面,而不是整个程序的最上面。

函数声明会被提升,但函数表达式不会被提升。
————————————————
版权声明:本文为CSDN博主「木心Do」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33505829/article/details/86158287

原文地址:https://www.cnblogs.com/weijiangZ/p/12256625.html

时间: 2024-11-05 13:51:23

什么是变量提升?什么是函数提升?的相关文章

变量提升和函数提升

1.变量提升 变量提升是将变量声明提升到它所在作用域的最开始的部分. 2.函数提升 创建函数有两种方式,一种是函数声明,一种是函数表达式,只有函数声明才有函数提升. 3.函数提升和变量提升的优先级 函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖. 原理: 原文地址:https://www.cnblogs.com/LeonMtd/p/9768074.html

作用域、变量提升、函数提升、数据类型

一.作用域分类 (作用域范围内定义的变量,整个作用域都可以访问) 1. 全局作用域 使用var声明(或者不严格模式下没有声明)且在函数外定义的变量,其作用域范围是全局的,称其为全局作用域. 2. 函数作用域 使用var声明且在函数内部定义的变量,其作用域范围是整个函数,称其为函数作用域. 3. 块作用域(ES6) 使用let(或者const 常量)声明且在一个花括号(非函数)里面,其作用域范围就是这个花括号以内,称其为块作用域. 二.变量提升 (变量声明会提升至函数或者语句的最前面,位置还在其作

278 执行上下文、执行上下文栈:变量提升与函数提升,执行上下文,执行上下文栈,全局执行上下文,函数执行上下文,练习题

变量提升与函数提升 变量提升: 在变量定义语句之前, 就可以访问到这个变量(undefined) 函数提升: 在函数定义语句之前, 就执行该函数 先有变量提升, 再有函数提升 变量声明提升.函数声明提升 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01_变量声明提升.函数声明提升</title> &l

js变量提升和函数提升

变量,作为编程语言最基础的部分,每种语言的变量不尽相同,但又大径相庭.大部分编程语言的变量有块级作用域,如if.for.while... 但JavaScript不纯在块级作用域,而是函数作用域,并且有自己独有的特性--变量提升.(ES6新添加的let.const使其可以用块级作用域) 对于函数的变量访问时遵循作用域链的,即当前函数运行时会有一个当前作用域,当饮用某个变量时,会先查找当前作用域内是否存在该变量的定义,如果不存在则根据作用域链向上去查找父函数的作用域,有则拿来使用,没有则继续向上直到

深入理解js的变量提升和函数提升

一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: 1 2 3 4 5 6 7 8 9 10 console.log(global); // undefined var global = 'global'; console.log(global); // global function fn () { console.log(a); // unde

JavaScript系列文章:变量提升和函数提升

第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3. 为什么要进行提升 4. 最佳实践 那么,我们就开始进入主题吧. 1. 变量提升 通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理.(注:当前流行的JS引擎大都对源码进行了编译,由于引擎的不同,编译形式也会有

对javascript变量提升跟函数提升的理解

在写javascript代码的时候,经常会碰到一些奇怪的问题,例如: console.log(typeof hello); var hello = 123;//变量 function hello(){//函数声明 } console.log(typeof hello); var hello = function(){//函数表达式 } console.log(typeof hello);//function number function 对于为什么会是这样的一个结果:function numb

js中函数提升及var变量提示

其中,在javascript中,函数声明及var声明的变量会得到提升.但是函数声明会先于var声明的变量被提升.即便function写在后面. 看下面的例子: var aa = 221; function aa(){ alert(111); } console.log(aa); //221 说明了函数声明先被提升了.而后面的var aa声明覆盖了aa函数,所以打印出来的是 ------ 221. 上面的语句在浏览器解析的时候其实是这样的. function aa(){ alert(111); }

javascript 变量/函数 提升

1.JavaScript hoisting(变量/函数 提升) 以下实验都是通过firefox的Console做的实验. console.log(a); ReferenceError: a is not defined console.log(a); 但是,如果在后面加上变量的定义的话,结果将会变得不同. console.log(a); var a = 10; undefined 之前变量没有定义的错误没了,取而代之的是告诉我们a的值是 'undefined'. 先不管a的值缘何为 'undef

js变量提升与函数提升

在es6之前,js语言并没有块级作用域,即{}形成的作用域,只有全局作用域和函数作用域,所谓的提升,即是将该变量的声明或者函数的声明提升,举个例子 console.log(global); //undefined var global = 111; console.log(global);//111 显然,上面代码处于一个全局的作用域中,在该作用域中使用var声明了一个global变量,其实际的声明过程如下: var global; console.log(global); //undefine