第一部分
第二章:词法作用域
// js只存在两个作用域 函数作用域和块级作用域 快作用域只有let和const ,var不会有块作用域 只会在函数作用域不能用
// if不会生成快作用域
// let会隐式生成块作用域
// 两个代码是一样的
var a = 3;
if (a === 3) {
let b = 1;
console.log(b); //1
}
if (a === 3) {
{
let b = 1;
console.log(b); //1
}
}
console.log(b); //预期not defined referenceerr ,结果not defined referenceerr
var a = 3;
console.log(b);//预期undefined
if (a === 3) {
{//看来这里的var提升了 , 这个显示的块级作用域只是对let和const 有效果,其实用了let之后加不加这个显示作用域都一样
var b = 1;
console.log(b); //1
}
}
console.log(b);//这里还是能输出1
var a = 3;
if(a === 3){
var b = 1;
console.log(b); //1
}
console.log(b);//预期1 结果1
function foo(str){
eval(str);
console.log(a);// 2
}
foo('var a = 2')
console.log(a);// a is not defined ,与 undefined 不同 ,undefined是声明了 ,这里看起来var的声明只提升到了函数作用域
//严格模式下eval有自己的作用域
function foo(str){
'use strict';
eval(str);
console.log(a);// 2
}
foo('var a = 2')
console.log(a);// a is not defined ,与 undefined 不同 ,undefined是声明了 ,这里看起来var的声明只提升到了函数作用域