2.0、作用域和预解析

mac2022-06-30  26

一、作用域份为全局作用域和局部作用域 作用域不仅有有变量作用域还有函数作用域

var a = 10 // a是全局作用域 在哪里都能访问和修改 function fn() { var b = 8 //这是局部作用域也成为函数作用域 console.log(a) //10 a是全局作用域 } console.log(b) //这里b是不存在的 会报 function fn() { var a = 10; console.log(a) function say() { var b = 2 console.log(b) //2 console.log(a) //10 可以访问到 } say() //可以调用 } fn() console.log(a) //报错 say() //报错

//预解析

//预解析 热身运动 console.log(b) //undefined var b = 10 console.log(c) //报错 c = 10 // js执行时 步骤 // 1、预解析 // 找东西 (var 函数 参数) 步骤: // 1.var :找到var 给var 的变量赋一个undefined 提到最前面 // 2.函数: 找到函数整体提到最前面 // 3.参数:同var //例如: // console.log(b) //undefined // var b = 10 // 找东西 var a = undefined; console.log(a) //所以 是undefined var a = 10 // 小案例: var a = 10; function fn() { console.log(a) //undefined var a = 5; } fn() console.log(a) //10 //首先预解析 // 找var提到最前面 // var a = undefined // 函数是一个作用域也要提到前面 进行预解析 // 函数中的预解析 // function fn() { // 找var a = undefined; // console.log(a) //undefined 它是先看自己域中有没有这个值没有在往外找 // 赋值 a = 5 // } //赋值 a = 10 // fn() // console.log(a) //10 完事 逐行解读

思考:

// 小案例: var a = 10; function fn() { console.log(a) //10 a = 5; } fn() console.log(a) //5

参数同var

//预解析 var a = undefined; function fn(a) { // 参数同var相当于 a = undefined console.log(a) //undefined a = 2 //局部变量赋值 } a = 10 //全局变量赋值 fn()//注意这里是没有实参的 console.log(a) //10

有实参

//有实参 var a = 10; function fn(a) { console.log(a) //10 a = 2 } fn(a) //有实参 console.log(a) //10 // 预解析 var a = undefined function fn(a) { // 形参是实参传过来的 相当于这里有 var a = 10; //局部变量 console.log(a) //10 a = 5 //给局部变量赋值 } a = 10 //这里是全局变量 fn(a) console.log(a) //10 // 预解析如果同名 // 函数 > 参数和var function fn(a) { var a = undefined //被覆盖var a = function a() {} console.log(a) //是个函数 function a() {} var a = 5; 他也干不过 变成了a = 5 function a() {} //函数大于参数和var 直接覆盖 console.log(a) //5 } fn(1)

解决为什么函数表达式只能在定义后面调用

fn() //报错 var fn = function() {} //因为他提上去 var fn =undefined fn() //正常执行
最新回复(0)