一、作用域份为全局作用域和局部作用域
作用域不仅有有变量作用域还有函数作用域
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() //正常执行