var a = 18; f1(); function f1() { var b = 9; console.log(b); console.log(a); var a = "123"; }
解析器:
预解析: 全局作用域 1. 先找到var function 和参数 2. 找到var 和function 之后,会吧var 和function 提前
解析 :从上到下一行一行的执行代码。
执行到f1之后 进入局部作用域 ,之后再按照预解析 和一行一行执行代码的进行执行
console.log(c); console.log(b); console.log(a); function f1() { // a 是局部变量 b,c是全局变量 var a = b = c = 9; console.log(a); console.log(b); console.log(c); }
打印的结果是: 9 , 9 , 9 ,9, 9,is not defined 。
闭包是:在函数的内部 可以访问函数外部的变量
变量提升 函数提升
函数声明 和函数表达式的区别
函数声明
此处的代码执行没有问题,javaScript解析器首先会把当前作用域的函数声明提前到整个作用域的最前面 ,---- 函数的提升
console.log(f(5,6)); function f(a,b) { return a + b; }
函数表达式
报错 :myfun is not a function
因为变量提升 。定义变量的时候, 变量的声明会被提升到作用域的最上面,变量的赋值不会提升 --- 变量的提升
myfun(5,6) var myfun = function (a,b) { return a + b; }