// 考题二,考变量提升和没有块级作用域:
console.log(a);
if ('a' in window) {
var a = 10;
}
console.log(a);
// 考题三,考函数作用域:
if ('a' in window) {
(function(){
var a = 10;
}());
}
console.log(a);
搞不懂'a' in window为什么是true;
首先明白两点:
变量声明会提升,即使是在if语句内
全局变量都是window对象的属性
所以第一个问题
console.log(a);
if ('a' in window) {
var a = 10;
}
console.log(a);
代码相当于
window.a = undefined;
console.log(a); //undefined
if ('a' in window) {
var a = 10;
}
console.log(a); //10
第二个问题,a在函数作用域内声明,不会成为全局变量
if ('a' in window) {
(function(){
var a = undefined;
a = 10;
}());
}
console.log(a); //error,a is not defined
JavaScript的变量作用域里有一条规则“全局变量都是window对象的属性”
a用过之后就是window对象一个属性了;
1、先说考题2,在javascript中是没有块级作用于的,也就是说,题中的代码等同于一下代码:
console.log(a);
var a;
if ('a' in window) {
a = 10;
}
console.log(a);
另外,使用var声明的变量和使用function声明的函数在执行之前会被前置,所以题中代码等同于一下代码:
var a;
console.log(a);
if ('a' in window) {
a = 10;
}
console.log(a);
而var a;声明变量可以认为相当于在window上注册了a变量:window.a。所以就这样了
2、考题3是吧var a = 10 ;放到了一个闭包里面:
(function(){
var a = 10;
}());
这是一个函数,javascript中是有函数作用域的,所以a的声明是无法提出来到外面的,在外面也无法引用到a,所以执行结果会报错。