第一道:
var a = 10; // 全局作用域,全局变量。a=10
function foo() {
// var a
//的声明将被提升到到函数的顶部。
// 比如:var a
console.log(a); // 打印 undefined
// 实际初始化值20只发生在这里
var a = 20; // local scope
}
foo();
看图说话:
第二道:
let和const声明可以让变量在其作用域上受限于它所在的块、语句或表达式中。和var不同的地方在于,这两个声明的变量,不会被提升。并且我们会有一个称为暂时死区(TDZ)。如果访问TDZ中的变量的话,就会报ReferenceError,因为他们的的作用域是在他们声明的位置的,不会有提升。所以必须在执行到声明的位置才能访问。
var a = 10; // 全局使用域
function foo() { // TDZ 开始
// 创建了未初始化的'a'
console.log(a); // ReferenceError
// TDZ结束,'a'仅在此处初始化,值为20
let a = 20;
}
foo();
结果是:
看图说话:
第三道:
var x = 10; // 全局变量
var foo = {
x: 90,//foo对象的内部属性
getX: function() {
return this.x;
}
};
foo.getX(); // 此时是指向的foo对象,
console.log(foo.getX())
//所以打印的是X属性 值就是90
let xGetter = foo.getX;//xGetter是在全局作用域,
//这里的this就是指向window对象
xGetter();
console.log(xGetter())// 打印 10
结果:
看图说话: