Javascript中的变量提拔、函数提拔及变量接见准绳

1、变量提拔

什么是变量提拔?
在函数体内声明的变量,不管你是在函数的最底端照样中心声明的,那末都邑把该变量的声明提拔到函数的最顶端(相当于第一行),然则只是提拔变量的声明,不会赋值。

var num = 10;
fun(); //输出效果为undefined
function  fun(){
    console.log(num);
    var num = 20;
}

/*上面这个函数相当于:
    function  fun(){
        var num;
        console.log(num);
        num = 20;
    }
*/

2、函数提拔

什么是函数提拔?
在JavaScript中以函数声明的体式格局建立的函数就跟用var建立的变量一样,它们的声明都邑提早声明,这就使得我们在JavaScript中能够挪用函数在前面,而声明函数在后面,这就是函数提拔。

func();
function func(){
    alert(“函数执行了!”);
}
/*
上面这段代码相当于:
function func(){
    alert(“函数执行了!”);
}
func();
*/

3、函数与变量同名时的变量提拔

alert(fun); // 终究输出效果为:输出fun函数体
function fun(){
    alert(“我是一个函数”);
}
var fun = “我是一个变量”;
alert(fun); // 输出:我是一个变量

/* 为何第一个alert输出的是fun函数体,而第二个alert输出的是“我是一个变量”?
由于用var声明的变量及function声明的函数在执行前都邑将声明提拔到最前面,假如变量与函数同名,
那末在声明的时刻会疏忽变量,只提拔函数声明! */

/*
上面这段代码相当于:
function fun(){
    alert(“我是一个函数”);
}
alert(fun);
fun = “我是一个变量”;
alert(fun);
*/

4、变量搜刮准绳(变量接见准绳)

在JavaScript中变量的接见(搜刮)是有准绳的:

1)、首先在接见变量的作用域(函数)中查找该变量,假如找到直接运用
2)、假如没有找到,去上一级作用域中查找,假如找到直接运用
3)、假如照样没有找到,则再去上一级作用域中查找,晓得全局作用域
4)、假如找到了就直接运用,假如没有找到则报错
var num = 123;
function foo1(){
    function foo2(){
        console.log(num);
    }
    /*当挪用foo2时,会首先去foo2这个作用域中查找是不是有num变量,效果没找到则去上一级作用域(即foo1)中查找是不是有foo1变量,
    效果还 是没找到,则再去上一级作用域(全局作用域)中查找,效果找到了,则拿来运用*/
    foo2();
}

5、变量提拔、变量搜刮机制典范面试题

fun();

console.log(b);
console.log(c);
console.log(a);

functoin fun(){
    var a = b = c = 9;
    console.log(a);
    console.log(b);
    console.log(c);
}
    原文作者:heath_learning
    原文地址: https://segmentfault.com/a/1190000017758044
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞