js预解析

566 阅读2分钟

题目一

var num1 = 55;
var num2 = 66;

function fn(num,num2) { 
    num  = 100; 
    num1 = 100;
    num2 = 100;
    console.log(num);  
    console.log(num1);
    console.log(num2);
}
fn(num1,num2);
console.log(num1); 
console.log(num2); 
console.log(num);

答案:100 100 100 100 66 num报错

解析: 预解析

var num1;
var num2;

function fn(num,num2) {  // num = 55,num2 = 66
    var num,num2;
    num  = 100; 
    num1 = 100; => 全局变量会覆盖函数外面的num1
    num2 = 100;
    console.log(num);  // 100
    console.log(num1);  // 100
    console.log(num2);  // 100
}
num1 = 55;
num2 = 66;
fn(num1,num2);
console.log(num1); //100
console.log(num2); // 66
console.log(num);   //没有声明 报错

题目2

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

function fn3() {
    var a = b = c = 9;
    console.log(a);
    console.log(b);
    console.log(c);
} 

答案: 9 9 9 9 9 报错

解析:

预解析:把函数提升到当前作用域最顶端。 var a = b = c = 9; => var a = 9; b = 9; c = 9; 这里b,c是全局变量。 所以函数里面 a,b,c打印都为9。函数外面b,c是全局变量打印都为9。a为局部变量所以报错(未定义)。

题目3

var n = 0;

function a () {
    var n = 10;
    function b() {
        n++;
        console.log(n);
    }
    b();
    return b;
}

var c = a();
c();
console.log(n)

答案:11,12,0

解析:

a() => function b() {
        n++;
        console.log(n);
    }
n函数a声明了n为10,此处n++,打印n为11。
c() => 又调用了一次a() => 这时n为11 => n++ => 12。
最后n打印的是全局变量,所以为0。

题目4

var x = 10;
function fn() {
    console.log(x);
} 
function show(f) {
    var x = 20;
    f();
}
show(fn);

答案:10

解析:

在函数内定义的变量不能在函数之外的任何地方访问,因为变量仅仅在该函数的域的内部有定义。相对应的,一个函数可以访问定义在其范围内的任何变量和函数。换言之,定义在全局域中的函数可以访问所有定义在全局域中的变量。在另一个函数中定义的函数也可以访问在其父函数中定义的所有变量和父函数有权访问的任何其他变量。 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions

题目5

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

var obj = {
    fn2 : function() {
        console.log(fn2);
        console.log(this.fn2);
    }
}

obj.fn2();

答案:

fn2报错未定义 。 
function() {
    console.log(fn2);
    console.log(this.fn2);
}

解析:obj里fn2没有声明。所以报错。this指向的obj。所以obj.fn2打印的函数。

题目6