第一道:
var a = 10; // 全局作用域,全局变量。a=10function foo() {// var a //的声明将被提升到到函数的顶部。// 比如:var aconsole.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'仅在此处初始化,值为20let a = 20;}foo();
结果是:
看图说话:
第三道:
var x = 10; // 全局变量var foo = {x: 90,//foo对象的内部属性getX: function() {return this.x;}};foo.getX(); // 此时是指向的foo对象,console.log(foo.getX())//所以打印的是X属性 值就是90let xGetter = foo.getX;//xGetter是在全局作用域,//这里的this就是指向window对象xGetter(); console.log(xGetter())// 打印 10
结果:
看图说话: