题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
注意:若变量使用关键字如 var
,const
,let
来定义,无论是在函数内部还是外部,该变量都是全局变量即是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
})()