作用域和预解析
Posted tongguilin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作用域和预解析相关的知识,希望对你有一定的参考价值。
// 作用域:
// 域:空间、范围、区域……
// 作用:读、写
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() //正常执行
以上是关于作用域和预解析的主要内容,如果未能解决你的问题,请参考以下文章