您现在的位置:首页 >> 前端 >> 内容

阿里巴巴js面试题1

时间:2017/8/4 11:00:58 点击:

  核心提示:该题难度系数: ★★★考查的技术点: 1). 变量提升2). 函数提升 3). 预处理 4). 调用顺序var c = 1;function c(c) {console.log(c);var c = ...

该题难度系数: ★★★

考查的技术点: 1). 变量提升2). 函数提升 3). 预处理 4). 调用顺序

    var c = 1;
    function c(c) {
        console.log(c);
        var c = 3;
    }
    c(2);

运行结果:

阿里巴巴js面试题1

看到这结果有没有大吃一惊?

我们现在来分析下原因。

这里我们先来了解下“预处理”,那什么是预处理呢?js语言本身具有预处理机制,js引擎在预处理期对所有声明的变量和函数进行处理,就是先把变量进行声明并读到内存里。也就是收集用var声明的变量信息和函数声明信息

还有一点是预处理时,变量和函数的优先顺序,先变量后函数。当变量名和函数名一致时后者会覆盖前者,我们看下下面的小案例,

    function b() {
    }
    var b
    console.log(typeof b)

结果为function,这就证实了,我们刚才的结论,执行顺序先变量后函数,变量名一致时,函数就会覆盖变量。

再来说一下预处理,看一下下面的小案例:

    var a = 2  
    function fn() {  
        console.log(a)  
        var a = 3  
    }  
    fn()

运行下,结果为undefined。

为什么为undefined呢?因为这里预处理顺序是这样的,外面声明了个全局变量a,值为2,但是里面把a声明成了局部变量,函数内部的预处理顺序为先声明var a;然后console.log(a);最后a=3;所以我们调用函数的时候,里面是有a,所以不会调外面的全局a,只是里面的a暂时还没有值,因为a=3这赋值步骤是在console.log(a)后面执行的,所以我们运行时就看到undefined了。拓展下,如果函数里面去掉var,那么打印出来的值就是2了,然后全局变量a又被赋值为3。

那好,我们现在回到我们刚才的题目上来,刚才题目的解析顺序可以理解为以下步骤:

先预处理var c;

然后预处理整个c函数

function c(c) {
console.log(c)
var c = 3
}

此时c的typeof为function

接下来再给c赋值,值为1,即c=1,此时c是整型变量1.typeof为number了。

最后再执行c(2)调用函数。所以我们调用的时候当然就会报c不是一个函数的错误了,因为他现在是一个整型变量了啊,哈哈,是不是很伤脑筋啊……

最后我们再次运行以下代码,证实我们的结论:

    var c = 1
    function c(c) {
        console.log(c)
        var c = 3
    }
    console.log(c) // 
    console.log(typeof c) // 
    c(2) //

结果截图:

阿里巴巴js面试题1

再唠叨下,这题里面给我们设了陷阱,全局变量名、函数名、函数形参都是c,这是面试官为了迷惑我们的,考查我们的相关知识是否理解得透彻,分析是否仔细了。毕竟是名企面试题,很注重考查基础的……

作者:网络 来源:森森依然努力