作用域和预解析

// 作用域:

// 域:空间、范围、区域……

// 作用:读、写

 

 

script 全局变量、全局函数

自上而下

 

函数

由里到外

 

{}

 

 

浏览器:

“JS解析器”

1)“找一些东西” :var function 参数

 

a = ...

所有的变量,在正式运行代码之前,都提前赋了一个值:未定义

fn1 = function fn1(){ alert(2); }

所有的函数,在正式运行代码之前,都是整个函数块

 

 

JS 的预解析

 

 

遇到重名的:只留一个

变量和函数重名了,就只留下函数

 

2)逐行解读代码:

表达式:= + - * / % ++ -- ! 参数……

 

表达式可以修改预解析的值!

 

 

 

 

 

 

 

alert(a); // function a (){ alert(4); }

var a = 1;

alert(a); // 1

function a (){ alert(2); }

alert(a); // 1

var a = 3; 

alert(a); // 3

function a (){ alert(4); }

alert(a); // 3

 

 

alert( typeof a );

// a(); // 报错

*/

 

 

/*

var a = 1;

function fn1(){

alert(a); // undefined

var a = 2;

}

fn1();

alert(a); // 1

 

 

var a = 1;

function fn1(){

alert(a); // 1

a = 2; 局部可以改变外部,第二个a变成了2

}

fn1();

alert(a); // 2  

*/

 

 

/*

var a = 1;

function fn1(a){

alert(a); // undefined

a = 2;

}

fn1();

alert(a); // 1

 

 

 

 

var a = 1;

function fn1(a){

alert(a); // 1

a = 2;

}

fn1(a);

alert(a); // 1

 

 

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

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() //正常执行

 

 
































































































































 

 

 

 
































































































































posted @ 2020-01-22 20:17  珍惜缘份  阅读(154)  评论(0编辑  收藏  举报