关于函数作用域及变量声明提升的面试题

题1

注意:声明变量提升包括全局和局部

var a = 10;
function test(){
	/*
		分析:
		使用var关键字定义的变量具有函数作用域的限制,在解析阶段,变量会被提升至函数域的最顶部,此时变量的值是undefined
	*/
	console.log(a); //undefined
	a = 100;
	/*
		分析:
		函数test是作为window的属性方法被调用的,函数里的this自然就是window对象
		this.a中的this对象是window对象 window.a = 10
	*/
	console.log(this.a); // 10
	var a;
	/*
		分析:
		声明的变量被赋值为100:a = 100  
	*/
	console.log(a); // 100
	console.log(this.a); // 10
}
test(); // 等同于window.test();
window.test();

题2

注意:局部变量与全局变量同名时,在局部作用域里,局部的会覆盖全局的

var c = 100;
var c;
/*
	分析:
	1、变量声明提升
	2、同名变量被覆盖,后者会覆盖前者
	3、然后变量被赋值为100,c = 100   因此输出100,而不是undefined
*/
console.log(c); // 100

题3

注意:若变量使用关键字如 varconstlet来定义,无论是在函数内部还是外部,该变量都是全局变量即是window的属性

function test(){
	c = 11; // c 是全局变量
	console.log(c);
}
test(); // 11
console.log(c); // 11
console.log(window.c); // 11
console.log(window.hasOwnProperty('c')); // true
function test(){
	console.log(c); // undefined
	var c = 11;  // 使用了关键字var, 所以 c 是局部变量
	console.log(c); // 11
}
test(); 
console.log(c); // 报错:ReferenceError

题4

var a = 10;
(function(){
	console.log(a); // 10 a 表示全局变量
	a = 100; // 全局变量 a 的值变为 100
	console.log(this.a); // 100   this 是 window, this.a === window.a === 100
	console.log(a); // 100 a 表示全局变量
})()

题5

注意:数字与 undefined 的乘积为 NaN

var a = 10;
(function test(){
	var b = a * 2;
	var a = 20;
	var c = a + 1;
	console.log(b); // NaN
	console.log(c); // 21
})()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值