预解释:
是一个过程,在作用域形成之后,代码执行之前,把所有带"var"和"function"的提前声明或定义
作用域:
全局作用域:window下,一打开就会形成
私有作用域:一个函数就是一个私有作用域,函数执行的时候这个作用域就会形成
注意!全局作用域下的变量相当给window增加了一个属性
声明:高速浏览器这里有一个变量,var关键字的只有声明
定义:赋值过程,在预解释的时候function既声明还定义
预解释的时候遇到已经声明过的就不需要再重新声明但需要重新定义
console.log(obj1);
var obj1={name:"111"};
console.log(fn);
function fn(){};
//1.全局作用域形成
//2.全局作用域下的预解释:var obj1,function fn=xxxfff000
//3.代码执行:
01.console.log(obj1)输出obj;Undefined
变量只声明未定义就是Undefined
02.obj1=xxxfff111
03.console.log(fn);-->function fn(){}
内存分为两种
堆内存和栈内存
堆内存就是用来存储东西的,一般都是存储应用数据类型
栈内存就是存储"作用域"
小练习:
function d(){
console.log(a)
}
var a=1;
var obj={a:"bb"}
var obj={a:"dd",b:obj.a};
console.log(obj.a,obj.b);
d();
1.全局作用域形成
2.全局下预解释:var: a和obj(第一个),function d=xxxfff000
3.代码执行
01.d(),函数体里面代码执行,输出Undefined(只声明未定义)
02.a=1
03.obj=xxxfff111(a:"bb")
04.obj=xxxfff222(a:"dd",b:xxxfff111.a),先存储后生成地址,在存储的过程中obj指的是谁
05.执行输出 obj.a-->"dd",obj.b-->"bb"
06.d() 输出a=1
赋值的过程是先将=等号右边的进行计算,之后再赋给左边的变量
预解释的特殊情况
等号右边不进行预解释(函数作为值的时候不进行预解释)
var ff=function(){
console.log(1)};
return 下面的代码不执行但是需要的预解释,return返回出的内容执行但是不进行预解释
function fn(){
var a=0;
console.log(f);// 会输出整个函数function f(){}
return function(){
console.log(1)};
function f(){};}
不论条件是否成立都进行与解释
console.log(num);
if (0){
//虽然条件不成立 但是需要预解释
var num=0
}
检测某个作用域里是不是有这个属性用"in"
ss=0;//->window.ss=0 console.log("ss"in window);
小练习
comsole.log(aa);
if(!("aa"in window)){
var aa=1;
}
console.log(aa)
自执行函数 不进行预解释
cosole.log(sss);
(function sss(){
console.log("a")})()
----------
>预解释的时候遇到已经声明过的变量不需要声明了,但是需要定义
>```
>function s1(){
>console.log("s1")}
>function s1(){
>console.log("s11")}
>```
>1.全局作用域形成
>2.预解释var s1 ,function s1=xxxfff000,s1=xxxfff111
>3.代码执行: s1=1
>最后输出 1