资讯专栏INFORMATION COLUMN

javascript 变量提升(Hoisting)

TwIStOy / 1420人阅读

摘要:简介变量提升意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。

简介
“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。  
实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。
声明变量的方法

var、let、const
不用以上关键字直接赋值的变量会挂载与windows环境下;

let a=9
const a=1
var a=6
c=5
声明函数的方法

javascript中声明函数的方法有两种:函数声明式和函数表达式。

//函数声明
function say(){
    console.log("hello") 
}

//函数表达式
var say=function (){
    console.log("hello") 
}
提升的好处
JavaScript 在执行任何代码段之前,将函数声明放入内存中的优点之一是,这允许你可以在在声明该函数之前使用一个函数。
/*** 正确的方式:先声明函数,再调用函数 (最佳实践)*/
function catName(name) {
    console.log("我的猫名叫 " + name);
}
catName("Tigger");
/*以上代码的执行结果是: "我的猫名叫 Tigger"*/


/*** 不推荐的方式:先调用函数,再声明函数 */
catName("Chloe");
function catName(name) {
    console.log("我的猫名叫 " + name);
}
/*代码执行的结果是: "我的猫名叫 Chloe"*/
提升规则

var 声明的变量,提升时只声明,不赋值,默认为undefined;不用关键字直接赋值的变量不存在提升(demo1)

函数提升会连带函数体一起提升,不执行;(deom2)

预解析的顺序是从上到下;(demo4)

函数的优先级高于变量,函数声明提前到当前作用域最顶端;(deom3)

变量重名,提升时不会重复定义;在执行阶段后面赋值的会覆盖上面的赋值;(demo4)

函数重名,提升时后面的会覆盖前面;(demo5)

函数和变量重名,提升函数,不会重复定义,变量不会覆盖函数;在执行阶段后面赋值的会覆盖上面的赋值;(demo8)

用函数表达式声明函数,会按照声明变量规则进行提升;(deom6)

函数执行时,函数内部的变量声明和函数声明也按照以上规则进行提升;(deom7)

let、const不存在提升;(demo9、demo10)

/**demo1**/
console.log("a=",a) //a=undefined
console.log("b=",b) // Uncaught ReferenceError: b is not defined
var a=1
b=6


/**deom2**/
console.log("a=",a)  // a=function  a() {console.log("func a()")}
function  a() {
console.log("func a()")
}

/**deom3**/
console.log("a=",a) // a=function  a() {console.log("fun a")}
var a=3
var a=4

function a(){
console.log("fun a")
}
var a=5
var a=6
console.log("a=",a) // a=6



/**deom4**/
console.log("a=",a)  // a=undefined
var a =2
console.log("a=",a) //
var a =3
var a =4
console.log("a=",a) // a=4
console.log("b=",b) //b= undefined
var b="b1"


/**deom5**/
console.log("a=",a) // a=function  a() {console.log("a2")}
function a(){
console.log("a1")
}
function a(){
console.log("a2")
}
console.log("a=",a) // a=function  a() {console.log("a2")}


/**deom6**/
console.log("a=",a) // a=undefined
var a=function(){console.log("a1")}
var a=3
var a=4
var a=5
console.log(a)
var a=function(){console.log("a2")}
console.log("a=",a) // a= ƒ (){console.log("a2")}


/**deom7**/
console.log("b=",b)
var a=3
function b(i){
    console.log("a=",a)
    var a=4
    function a(){
        console.log("fun a")
    }
    console.log("a=",a)
}
b()


/**demo8**/
console.log("a=",a) //a= function a(){ console.log("fun a")}
var a=2
function a(){
    console.log("fun a")
}
console.log("a=",a) // a=2
var a=3
var a=4
var a=5
console.log("a=",a) // a=5


/**demo9**/
console.log("a=",a) //Uncaught ReferenceError: a is not defined
let a=4


/****/

console.log("b=",b) // Uncaught ReferenceError: b is not defined
const b=5

参考资料
MDN

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109125.html

相关文章

  • 理解 JavaScript(二)

    摘要:所以形式参数是本地的,不是外部的或者全局的。这叫做函数声明,函数声明会连通命名和函数体一起被提升至作用域顶部。这叫做函数表达式,函数表达式只有命名会被提升,定义的函数体则不会。 Scoping & Hoisting var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; ...

    luxixing 评论0 收藏0
  • (深究)声明提前(Hoisting)

    摘要:有意思的是,这意味着变量在声明之前甚至已经可用。的这个特性被非正式地称为声明提前,即函数里声明的所有变量但不涉及赋值都被提前至函数体的顶部。但实际上会将其看成两个声明和。第二个赋值声明会被留在原地等待执行阶段。 简介 JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。有意思的是,这意味着变量在声明之前甚至已经可用。JavaScript的这个特性被非正式地...

    陈伟 评论0 收藏0
  • [翻译] JavaScript Scoping and Hoisting

    摘要:对于新手来说是最令人困惑的部分之一。函数声明通过的形式。很明显的,语言自身定义和函数形参已经处于作用域顶端。这就意味着,函数声明比变量声明具有更高的优先级。但是这却不意味着对这个名称的赋值无效,仅仅是声明的部分会被忽略而已。 原文链接:JavaScript Scoping and Hoisting 你知道下面的JavaScript代码执行后会alert出什么值吗? var foo = ...

    FingerLiu 评论0 收藏0
  • JavaScript 变量声明提升

    摘要:输出的结果为输出的结果为提升后输出的结果为重新定义了变量输出的结果为如果定义了相同的函数变量声明,后定义的声明会覆盖掉先前的声明,看如下代码输出练习的值是多少的值是多少第二题的解析请看这里参考资料文章文章中文版链接文章推荐文章变量提升 JavaScript 变量声明提升 原文链接 一个小例子 先来看个例子: console.log(a); // undefined var a =...

    fireflow 评论0 收藏0
  • JS基础篇--函数声明与定义,作用域,函数声明与表达式的区别

    摘要:在中,有四种方式可以让命名进入到作用域中按优先级语言定义的命名比如或者,它们在所有作用域内都有效且优先级最高,所以在任何地方你都不能把变量命名为之类的,这样是没有意义的形式参数函数定义时声明的形式参数会作为变量被至该函数的作用域内。 Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var ...

    TerryCai 评论0 收藏0
  • JavaScript中的变量提升(Hoisting)

    译者按: let和var对于变量提升的影响不同。 原文: What is Hoisting

    Mr_houzi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<