执行上下文
var function ; let const class
var 与function 会在全局对象 (window) 申明 ;
let const class 在全局scope中申明 ;
console.log(foo); // 函数体
console.log('aaa', aaa); // Uncaught ReferenceError: aaa is not defined
// 其实let const class
var 申明时初始化为 undefined
let const class (scope) 只是登记,没有初始化,因此不可使用,也没有 “变量提升”
/** 函数创建时会初始化一个函数对象并赋值给这个变量名,
&
* 函数在创建时会保留它创建时的文本环境,并保持对这个文本环境的引用
&
* 也就是该函数能使用它创建时文本环境的 ***变量
*/
if(false) {
var foo = 'foo'
}
function fn(){
var aaa = 1
}
函数作用域( 执行上下文 | | 文本环境 )
// ***函数作用域在创建时决定,不是调用时决定!;
// 在函数创建时,会保留创建时的执行上下文(可以引用)
function foo(){
console.log(a);
}
function bar(){
var a = 3
foo()
}
var a = 2;
bar(); // 2 创建时在全局创建,所以foo的执行上下文也就被保留了,foo函数可以应用它的执行上下文的变量
块级作用域
let sss = '111'
if(true){ // 此处执行完会效果,文本环境交给全局文本环境 不是特别理解
let sss = '222'
console.log('块级', sss); // 块级 222
}
console.log('全局', sss); // 全局 111
// 块中的函数有变量提升吗?
console.log(mmm); // undefined
// 块中的函数声名是否与全局的var let const 是否重复,重复了就不对此函数做任何处理,
// 若没有重复就在全局对象中创建一个与函数名同名的变量并初始化为undefined
// 与全局声明的函数 的区别是,全局声明的函数可以马上调用,而块中的函数初始化是undefined
if(false){// 为 true 下面就可以调用
function mmm() {
console.log('块中的函数');
}
}
// mmm()
let ooo
if (true) {
function ooo() {
console.log('sdsds');
}
}
ooo() // 报错:ooo is not a function! 函数和var 都在全局对象中声明,
// let在全局scope中声明,块中的变量ooo在全局对象找不到ooo,无法替换
var ooo
if (true) {
// 这里块中的函数与全局对象的变量var重名了,所以这里不会对这个函数做任何处理
function ooo() {
console.log('sdsds');
}
}
ooo() // sdsds 不报错
// 也是一个文本环境? 待定