本文主要介绍JavaScript中的变量作用域和提升的相关面试题,主要包括以下几个方面:
在JavaScript中,变量作用域分为全局作用域和局部作用域。
全局作用域是指在函数外部定义的变量拥有全局作用域,可以被任何函数访问。
var a = 10; function foo() { console.log(a); } foo(); // 输出10
局部作用域是指在函数内部定义的变量拥有局部作用域,只能被函数内部访问。
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中变量作用域和提升的面试题。
var a = 10; function foo() { console.log(a); var a = 20; } foo(); // 输出undefined
在函数内部,变量a被声明了但是还没有赋值,所以输出undefined。
var a = 10; function foo() { console.log(a); } function bar() { var a = 20; foo(); } bar(); // 输出10
函数foo在函数bar内部被调用,但是函数foo中的变量a并没有被重新定义,所以输出10。
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。
本文为翻滚的胖子原创文章,转载无需和我联系,但请注明来自猿教程iskeys.com