JS基础面试题01--预解析与作用域

下面是面试题

var a = 123;
function f1(){
console.log(a);
}
function f2(){
var a = 456;
f1();
}
f2();
console.log(a)

输出结果为123,123。
首先我们先看f2函数,里面定义了一个局部变量a还调用了f1。而f1执行后打印a。那这个a是全局的a还是局部的a呢?这就由函数的调用者决定了。而f1是一个全局函数,调用者是window,所以a自然是全局的a。结果为123。
再看console.log(a),也就是相当于console.log(window.a)。那这个全局的a有改变过吗?答案是否定的。这段代码只是定义的两次a,而a的作用域是在他定义的时候就确定的。全局的a是123,局部的a是456。
再看面试题

var a = 123;
function f1(){
console.log(a);
}
function f2(){
var a = 456;
f1(a);//传入一个变量a
}
f2();
console.log(a)

结果依然是123,123。
由于f1函数定义时并没有接收参数。所以传入的a无效。如果f1定义时是这样的function f1(a){console.log(a);} 那么结果就为456,123。

时间如果可以倒流,我想我还是会卯起来蹉跎
反正就这样吧,我知道我努力过
——五月天《一颗苹果》

你可能感兴趣的:(js)