预解释的不同机制
var的预解释机制
function 的预解释机制
预解释机制
面试题练习
预解释的的不同机制预解释也叫预声明,是提前解释声明的意思;预解释是针对变量和函数来说的;但是变量和function的的预解释是两套不同的机制;
当浏览器加载我们的HTML页面的时候,首先会提供一个供JS代码执行的环境->全局作用域global(浏览器中的全局作用域,也叫顶级作用域是window)
JS中的内存空间分为两种:栈内存、堆内存
栈内存;提供JS代码执行的环境,存储基本数据类型的值;->全局作用域或者私有的作用域其实都是栈内存;
堆内存;存储引用数据类型的值(对象是把属性名和属性值储存进去,函数是把函数体内的代码当做字符串储存进去)
在当前的作用域中,JS代码执行之前,浏览器首先会默认的把所有代var和function的进行提前的声明或者定义,->“预解释”(也叫变量提升)
var的预解释机制var a=1
1、代码运行之前,先扫描有没有带var关键字的变量名,有的话,为这个变量名在内存里开一个空间;这时候变量名a是不代表任何值的;用undefined来表示;undefined是一个标识符/记号,表示找不到这个变量名所代表的数据;不存在的意思;这个阶段叫变量的声明;
2、当代码运行的时候,则给数据1开辟一个内存空间;
3、让数据1和变量名a绑定在一起;变量类型指的就是数据类型;按照js语言的原理来说变量类型有undefined类型;但是数据类型是没有undefined这种数据类型的;只有”undecided”这种字符串类型(字符串类型是数据类型的一种);同理也没有unll这个数据类型,但是有”null”这种字符串类型;
var num; //1、声明(declare):var num; ->告诉浏览器在当前作用域中有一个num的变量了,如果一个变量只是声明了但是没有赋值,默认的值是undefined console.log(num);//->undefined num = 12; //2、定义(defined):num=12; ->给我们的变量进行赋值 console.log(num);//->12 //变量提前使用的话,就是undefined console.log(testStr);//undefined var testStr="22222222" function 关键字的预解释步骤function fn(){……}
在代码执行之前,把所有的带function关键字的脚本都扫描一遍,然后定义变量;并且同时给变量赋值;
1、函数的定义只是保存一些字符串;预解释的时候在内存里保存fn大括号里面的字符串;
2、代码运行时候,读到fn()时候,这个时候就是函数的运行;函数的运行,会先开辟一个堆内存把字符串当做代码在堆内存中再次运行,函数产生的作用域内还会再进行预解释和代码运行;
函数如果多次执行;会产生多个作用域;但是产生的多个作用域里面的内容都是相互独立的;互相没有关系;(在原型和原型链时候再仔细研究原理;)
fn(100,200);//->可以在上面执行,因为预解释的时候声明+定义就已经完成了 function fn(num1, num2) { var total = num1 + num2; console.log(total); } 总结1、var和function关键字的在预解释的时候操作还是不一样的
var -> 在预解释的时候只是提前的声明了这个变量,只有当代码执行的时候才会完成赋值操作
function -> 在预解释的时候会提前的把声明加定义都完成了(在代码执行的时候遇到定义的代码直接的跳过)
2、预解释只发生在当前的作用域下,例如:开始只对window下的进行预解释,只有函数执行的时候才会对函数中的进行预解释;
[重要]刚开始只对window下的进行预解释,fn函数中目前存储的都是字符串,所以var total没啥实际的意义,所以不进行预解释 -> “预解释是发生在当前作用域下的”
综合题;
console.log(obj);//->undefined var obj = {name: "xie", age: 25}; function fn(num1, num2) {//代码执行到这一行的时候直接的跳过这一块的代码,因为在预解释的时候我们已经完成了声明加定义 var total = num1 + num2; console.log(total); } var num1 = 12; fn(num1, 100);//执行fn,把全局变量num1的值赋值给形参num1,把100赋值给形参num2
下面是一个预解释思路
var a, b = 0, fn = function () { var a = b = 2; }; fn(); console.log(a, b);把上面解析成下面就好理解了
var a; window.b = 0; window.fn = function () { //var a = b = 2; var a = 2;//a是私有的和全局没关系 b = 2;//b是全局的 }; fn();//window.fn() console.log(a, b);//undefined 2 预解释机制
1、不管条件是否成立都要进行预解释
console.log(a);//->undefined if (!!("a" in window)) {//"a" in window -> true var a = "xie"; } console.log(a);//->xie