javascript声明提前

声明提前

通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理

首先明确一点:提升不是一个技术名词;
JS由V8引擎执行时,的解析执行JS顺序,存在的一种现象,但由于有的代码让人难以理解,
于是,变量提升成了了解JS执行过程的必备知识。

变量的声明(广义)

其实可用分为三部分:

  1. 创建 create
  2. 初始化 initialize
  3. 赋值 assign

先看看var

//在之前先了解一个小知识 typeof 判别一个变量的类型 
//typeof 变量 如果改变量为 赋值也是可用执行 且值为 undefined

//创建一个变量

//重复声明是不会报错的 注意这一点
var a; var b = 1; var a = 2;

c = 2; //注意这样的伪声明会将C属性挂载到window对象种
// "c" in window === true
//甚至可以在 函数内 声全局函数
function mountProInWindow() {
    c = 1;
}
//记得一定调用,不调用的话,不会执行代码
mountProInWindow();


for(var i=0; i<2; i++) {

}
console.log(i);
//注意var变量没有块级作用域

// 例子1
console.log(a); //a为undefined
var a = 1;
// 回顾 解析器先查找所有的变量声明带var的 找到 创建一个叫a的属性, 并初始化为undefined,直到执行声明语句时,再对其赋值 
// 接下来要理解 变量声明 提前了什么 创建 和 初始化

//例子2
if(foo) {
  // var foo; //var foo = 5;
}
console,log(foo)
//throw err

//例子3
var global = "global";
function func() {
  console.log(global);
  var global = "name";
}

func();

// 例子4
a = 1;
var a;
console.log(a)

变量声明是其实都是扫描一下变量对象,如果变量对象已经挂载过,那么就直接忽略声明操作,但是不忽略赋值

函数声明

//最经典的例子 函数不需要声明就可以使用
//注意这是一个纯函数声明
func(1);
function func(number) {
  console.log(number);
}

// 匿名函数表达式
a(1); //throw error a 不是一个函数
var a = function (number) {
  console.log(number);
}

//具名函数表达式
func(1);  // func 未定义
a(1);     //throw error a 不是一个函数
var a = function func(number) {
  console.log(number);
}
 
//小结 纯函数声明才有声明提前

思考: 如果变量声明和函数声明同时存在

//例子1
foo(); // 1 
 
var foo; 
 
function foo() {     console.log( 1 ); } 


//例子2
console.log(a); //function 
var a = 1;
function a() {
  
}
//理解函数 提升了 创建,初始化,赋值
var a;  //函数
var a;  //变量
a = function....;

猜你喜欢

转载自blog.csdn.net/wucan111/article/details/107624988
今日推荐