JavaScript中的变量作用域和提升的相关面试题

本文主要介绍JavaScript中的变量作用域和提升的相关面试题,主要包括以下几个方面:

一、变量作用域

在JavaScript中,变量作用域分为全局作用域和局部作用域。

1. 全局作用域

全局作用域是指在函数外部定义的变量拥有全局作用域,可以被任何函数访问。

var a = 10;
function foo() {
    console.log(a);
}
foo(); // 输出10

2. 局部作用域

局部作用域是指在函数内部定义的变量拥有局部作用域,只能被函数内部访问。

function foo() {
    var a = 10;
    console.log(a);
}
foo(); // 输出10
console.log(a); // 报错:a is not defined

二、变量提升

JavaScript中的变量提升是指在函数作用域内,变量的声明会被提升到函数作用域的顶部。

function foo() {
    console.log(a); // 输出undefined
    var a = 10;
    console.log(a); // 输出10
}
foo();

上面的例子中,变量a在函数内部被声明,但是在声明之前就已经使用了,这时候变量a的值是undefined。

三、函数作用域和作用域链

在JavaScript中,函数作用域是指在函数内部定义的变量拥有函数作用域,只能被函数内部访问。

function foo() {
    var a = 10;
    function bar() {
        console.log(a);
    }
    bar(); // 输出10
}
foo();

作用域链是指在函数嵌套的情况下,子函数可以访问父函数的变量。

function foo() {
    var a = 10;
    function bar() {
        console.log(a);
    }
    return bar;
}
var baz = foo();
baz(); // 输出10

四、闭包

闭包是指在函数内部定义的函数,可以访问外部函数的变量。

function foo() {
    var a = 10;
    function bar() {
        console.log(a);
    }
    return bar;
}
var baz = foo();
baz(); // 输出10

上面的例子中,函数bar是在函数foo内部定义的,但是函数bar仍然可以访问函数foo中的变量a,这就是闭包。

五、面试题

下面是一些关于JavaScript中变量作用域和提升的面试题。

1. 输出结果是多少?

var a = 10;
function foo() {
    console.log(a);
    var a = 20;
}
foo(); // 输出undefined

在函数内部,变量a被声明了但是还没有赋值,所以输出undefined。

2. 输出结果是多少?

var a = 10;
function foo() {
    console.log(a);
}
function bar() {
    var a = 20;
    foo();
}
bar(); // 输出10

函数foo在函数bar内部被调用,但是函数foo中的变量a并没有被重新定义,所以输出10。

3. 输出结果是多少?

var a = 10;
function foo() {
    console.log(a);
}
function bar() {
    var a = 20;
    return foo;
}
var baz = bar();
baz(); // 输出10

函数bar返回了函数foo,所以变量a的值是在函数bar内部定义的,但是函数foo中的变量a并没有被重新定义,所以输出10。

猿教程
请先登录后发表评论
  • 最新评论
  • 总共0条评论