前端面试题,js预处理部分小结,函数声明提升和变量声明提升

2017-11-25 19:39:30 4,345 views

预处理包括

1收集var 声明的变量提升

2.收集函数声明提升

function声明的变量优先级高于var声明的变量

常见的面试题:

-----------------------------------------------------------------------------------------------------------

变量和函数不同名

1.

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

 
 
输出结果为2
 
 

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

 
 
输出结果为undefined
关键在于var a=3;这里有变量提升
相当于执行了

var a=2;
function fn(){
var a;//对a进行了初始化
console.log(a);
var a=3;
}
fn();

 
-----------------------------------------------------------------------------------------------------------
 


2.

function foo(){
    console.log("函数声明");
}
var foo;
console.log(typeof foo);
console.log(foo);

 
输出结果为function,
function foo(){ console.log("函数声明"); }
 

function foo(){
    console.log("函数声明");
}
var foo="test";
console.log(typeof foo);
console.log(foo);

输出结果为
string
test

变量和函数同名的情况下

var c=1;
function c(){
}
console.log(c);
输出为1
var a;
function c(){
}
console.log(c);
输出为
function c(){
}

 ==》function声明的变量优先级高于var声明的变量,声明不会被覆盖,但是值会被覆盖

 变量重名

var a=1;
var a;
console.log(1);

 
这里第二行对a是一个重复宣告,而不是赋值,变量只有定义(宣告)后未赋值的情况下才会输出undefined,除非手动赋值undefined;那么这里,JS引擎对于重复宣告的规定以最近的变量指定(也就是赋值)作为变量在执行时的值,所以第二行的

var a;

其实相当于无效;

函数内部形参和内部的变量重名的情况

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

 
 
输出为1,3
虽然内部有变量声明提升,但是是一个重复宣告,而不是赋值,所以第一个c为1,除非手动赋值undefined;
 
 
然后看下阿里面试题

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

 
 
 
输出结果为
1
Uncaught TypeError: number is not a function

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

这里第一个输出1就不说了,第二个这里有个坑。
其实外面的执行是如下的

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

所以第二步执行c(2);自然会报Uncaught TypeError: number is not a function


3

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

 
 
输出结果为
function b() {}
2
2
相当于执行了

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

 
虽然外面给内部传了个参数,函数声明将值给覆盖了,所以输出为函数的引用,2,2
 
 
 
修改于18/3/15

4

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”即可将网页分享至朋友圈。