js作用域一道题

(function(){

        console.log(a)

        var a=5;

        function a(){}

        console.log(a)

        function b(){}

        b=6

        console.log(b)

        var c=d=b

    })()

为什么a不是因变量提升输出undefined,而是函数?

补充一个:

function fun(ger){
            console.log(ger); function ger(){
                alert("hello world");
            }
        }
        fun(5)

也是输出了函数 不是变量

阅读 1.7k
2 个回答

提升分两种

  • 变量提升

    • 只会提升变量,而不会提升值
  • 函数提升

    • 既会提升变量,也会提升值
    • 函数提升的层级是最高的

因为你下面声明了一个a函数,当然要打印a函数呀

注意

声明函数有很多种方式,只有 函数声明语句才会提升,即 function a () {}

而其他诸如构造函数,函数赋值等情况声明的函数,则不会提升

像下面这样就只会打印undefined了

(function(){

        console.log(a)

        var a=5;

        var a = new Function

    })()

因为 JS 是一种解释型语言(虽然含有一些编译型语言的特点),是在运行的时候将程序翻译成机器语言,需要相应的引擎来解释方可运行(编译型语言产品能够自由地直接运行)。
故在执行前会整个脚本代码加载到内存中,其中也包括加载部分函数声明,然后再从头开始执行,这也就是一个解释的过程。
所以上述代码的 ab 的声明提升等不是代码修改, a 已经通过解释声明为一个 a 函数了。在这个过程中没有生成中间代码,这只是JS解释器处理事情的方式。
值得补充的是,如果 a 函数和 a 变量声明的同时,那么会优先考虑声明函数,而相同的变量名声明会被直接忽略。

var a1
function a1(){}
console.log(a1) //为a1函数

function a2(){}
var a2
console.log(a2) //为a2函数
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题