打好基础,查漏补缺
基础是重中之重
函数声明和函数表达式
函数定义有两种方式,一种是函数声明,一种是函数表达式
函数表达式中函数名称会自动放弃函数名称
js执行过程
1、语法分析
2、预编译 ( 发生在函数执行的前一刻 )
3、解释执行
js在执行之前会通篇扫描查看是否有基础语法错误,然后预编译在逐行解释执行
预编译过程
预编译前奏
1、imply global 暗示全局变量
任何变量在未声明就赋值时,该变量就归全局所有.
function test(){
var a = b =3
}
test()
window.b = 3
2、一切声明的全局变量,全是window的属性
window就是全局的域
预编译过程
函数内部预编译有4步。
1、创建AO对象 Activation Object (执行期上下文)
2、找到变量和形参,将其作为属性放入AO对象,值为undefined
3、统一实参和形参的值
4、找到函数声明,将函数名作为属性放入AO对象,函数值为函数体
function test(a){
console.log(a) // function
var a = 123
console.log(a) // 123
function a(){ }
console.log(a) // 123
var b= function(){ }
console.log( b) // function
function d(){ }
}
test(1)
全局的预编译
第一步生成GO对象 global Object
GO === window
无同步形参与实参值的过程
块级作用域中声明函数
2020/06/12
今天在看es6块级作用域时,发现了一些有点不理解的问题。
function f() { console.log('I am outside!'); }
(function () {
console.log(f)
// var f = 0
if (true) {
console.log(f)
f()
// f = 1
function f() { console.log('I am inside!'); }
f = 2
}
console.log(f)
// f();
}());
在我断点后发现,在块级作用域中声明函数,首先会现在当前函数作用域或者全局作用域中 提升一个变量为undefined, 然后在块级作用域中 提升变量 为函数体。
当if中条件为 true
最后一个打印 输出为 函数体
将f = 1 注释放开 ,最后一个打印输出为 1
说明执行了函数声明的代码后,影响到了外层函数作用域
当if中条件为fasle
所有打印都为 undefined