00:00
大家好,我是上硅谷H5学科讲师刘志远。在程序员节到来之际呢,给大家分享一道面试题。第一道呢,我们叫做作用域,那作用域我们指的是一个变量的访问区域。首先呢,我们定了一个VR number等于55。然后是VR number等于66,那。这两个变量呢,我们认为它是一个全局的变量,所以它被定义到window上。那再往下呢,我们会看到一个定函数,那函数名呢,叫做F1。里边呢,有两个形式参数。好,那函数题当中呢,我们先不来读,因为我们没有进行调用,所以呢,此时是不会运行的。那23行呢,我们调用了这个F1函数,并且传入两个实际参数,那分别就是NUMBER1 number2,就是我们刚才在全局当中定义的这两个变量。那此时呢,在内存当中我们说了。
01:00
哎,我们的变量呢,是的值是存储在我们的战内存当中的,那现在呢,变量之间的一个负值,相当于是一个我们的值进行一个传递,那它会重新COPY1份啊,并且呢,把它复制给另一个变量,所以此时在这一块呢,我们相当于把55跟66。复制了一份,然后传进我们的参数当中啊,传进我们的这个。函数当中。好好保存一下。那现在呢,我们看这个函数题。那刚才我们会看到呢,有两个。形式参数,那这两个形式参数呢,我们会认为呢,它是在我们的函数的内部进行一个变量呢,先是一个声明。We are number和谁呢?和我们的?We are number1。好,我们说呢,GJS当中呢,我们的作用域呢,分为两块,一块呢叫做函数的作用域,一个就是全局作用域。
02:05
那在两个作用当中呢,我们都有一个什么呀,都有一个叫做一个变量的声明的一个提升。啊,那此时这两个形式参数呢,就相当于我们定义两个变量。啊,只是一个声明。那接下来我们刚才把这个值传进来了,那此时呢,我们的NUMBER1就应该被赋值到55。然后下边的NUMBER1是一个66。啊,那这两个呢,我们认为是一个掩饰的啊,或者说呢,我们是一个看不到的这么一个过程。那再往下啊,那我们看number等于100,那这个number访问的就是我们的形式参数当中的number,也就是把之前的55呢改成了100。下边的NUMBER1呢,也同样是访问的我们的形式参数NUMBER1,那把之前的66呢改变成100,所以此时我们认为啊,当前这两个值呢,已经被改变成了100。
03:05
那再往下呢,有个number等于100,那这个时候呢,那NUMBER2到底是谁呢。那我们说我们需要把整个的函数体都看完,在整个函数当中呢,如果我们发现啊,有一个用VR声明的number,那此时呢,就是我们函数内部的一个私有变量。或者说就是在当前我们的函数作用当中呢,我们进行了一个声明,那此时呢,如果是有声明的话呢,我们将声明进行一个提升,那我们看到是没有,那没有此时的NUMBER2呢,返回的就是函数外我们全局当中的NUMBER2。所以呢,把我们刚才的66呢,改成了100啊,所以在这呢,我们也给他写一下。好,接下来呢,是我们的log打印日志的方式来访问变量,那这个一我们刚才说了就是我们的。形式参数当中的number。那下面这个NUMBER1呢,也是形式参参数参数这个number。
04:06
好,那再往下啊,这个NUMBER2 number2是什么呢?NUMBER2我们说也是刚才我们的相当于是全局当中这个number。那只不过呢,它的66呢,已经被改成100了,所以这块呢,也是一个一。好,那当前打印呢,这三个就是这个结果。啊,那我们的函数体执行完了以后呢,一定会跳出一个函数继续往下走,那继续往下往下走呢,我们看到下一行呢,也是一个访问,访问NUMBER1,那此时访问这个一呢。肯定不是我们。函数当中的这个NUMBER1啊,一定访问的是我们全局当中的NUMBER1,那全局当中的NUMBER1呢,55呢,没有被修改过,那此时这个NUMBER1呢,就是55。刚才NUMBER2呢,已经在我们的函数内部被改变了,66已经不再是啊,是100了。
05:03
所以当我们进行访问的时候呢,那这块呢,结果是一个100。那最后还剩一个number了,那这个number我们说了它是什么呀?它肯定不是函数当中的,因为我们从外界是不能访问的。那我们需要找一下全局当中有没有对我们的number进行一个VR的声明。那我们会发现没有,那么没有呢,此时呢,他一定就会报错了。所以最终的打印结果呢,我们这写一个报错。那顺序应该是一百一百一百,然后五十五一百,最终是报错,那我们来看一下运行。好,F12。哎,我们把窗口稍微缩小一点,那我们看整个的一个结果。哎,就是我们看到的放大点儿的。就是我们看到的100。
06:00
100。下班儿。55、100最后一个报错,报错信息是number is not DeFine没有被进行定义。那这就是我们第一道面试题的一个过程。
我来说两句