* 预解释
* 什么是预解释
* 关于预解释: 带var和带function不同
* 函数执行四阶段
* 作用域链
* 预解释无节操
* 闭包
* 运算符
* 栈内存和堆内存
* 堆内存和栈内存 的销毁
* this的总结
* ||或者 &&并且
预解释
什么是预解释
变量:
1.声明一个变量 var var 变量名 = 变量值;
2.= 赋值:将等号右边的变量值赋值给等号左边的变量名
3.变量的作用:存储值和代表值的
1:什么是预解释
在当前作用域下,在JS代码执行之前,浏览器会对带var和带function的进行提前声明或定义
关于预解释: 带var和带function不同
1:带var和带function不同
1)带var 只声明,不定义 var a;告诉浏览器有个变量叫做a,关于a的内容不知道
2)带function 声明加定义 var fn=xxxfff
2:带var和不带var的区别:
1 带var: 1) 在全局环境下,属于window的全局属性 2)带var会进行预解释
2 不带var: 1)属于window的全局属性 2)不带var不会进行预解释;
3:私有变量有2种:
1)当前作用域下,带var的; 2)形参;
函数执行四阶段
1)形成一个私有作用域
2)形参赋值
3)预解释
4)代码从上到下执行
4:函数返回值出现undefined的情况有两种
1)没有写return
2)写了return但是没赋值
作用域链
作用域链
当函数被调用的时候,会形成一个私有作用域,我们看该私有作用域下,是否有私有变量A
1)如果有私有变量A,那么该作用域中的A,都是私有变量跟外界没有任何关系
2)如果没有私有变量A,到上级作用域查找,如果没有继续往上找,找到window还没有的话,报错
预解释无节操
预解释无节操
1)只对等号左边带var的,声明但是不定义
2)已经声明过的,不会重复声明,但是重新赋值
3)在预解释阶段,函数的优先级大于变量
4)条件判断语句中,无论条件是否成立,都会进行预解释 (注意:条件为真,执行代码,条件不成立,输出的是全局变量)
5)return 后面的语句不会进行预解释 ,return下面的语句,虽然不执行,但是会进行预解释
6)匿名函数不进行预解释
7)自执行函数不会进行预解释,只有执行到他的时候,声明+定义+调用 同步完成
(function (n){ 形参
自执行函数只执行一次,传参一次 ,自执行函数也是匿名函数
return function(){
}
})(i)实参
obj.fn(); obj.fn执行的是return后面函数
执行的是return后面的函数
闭包
闭包
函数形成一个新的私有作用域保护里面的私有变量不受外界的干扰(外界修改不了私有的,私有的也修改不了外面的),这种保护机制叫做闭包
运算符
运算符
1)+ 两边遇到字符串--》字符串拼接
1+'zfpx' "1zfpx"
2)- * / 如果计算不成功--》NaN
1-'zfpx' NaN
运算符的优先级
1圆括号
2算数运算符
3逻辑与&&>逻辑或||
4比较运算符 == != === !==
5;三元运算符
6;赋值操作
运算符的优先级
算数运算符 大于 比较运算符 大于 逻辑 大于 赋值
栈内存和堆内存
栈内存和堆内存
栈内存: 提供一个供JS代码执行的环境(里面可以放轻量级的数据;基本数据类型)
栈内存有全局作用域 和私有作用域
堆内存:存放引用数据类型
对象数据类型:键值对
函数数据类型:代码字符串
堆内存和栈内存 的销毁
堆内存和栈内存 的销毁
1) 堆内存;让占用内存地址的变量,指向ary=null; var=[1,3]
2)栈内存;全局作用域和私有作用域
在浏览器加载完html页面的时候,全局作用域就形成了;
全局作用域销毁;关闭浏览器,关闭当前页面
3)私有作用域
销毁:在一般情况下,当函数执行完成的时候,默认会进行销毁,有两种特殊情况不销毁
1)不销毁:当函数体内有东西被外面的变量或其他占用的时候,该函数不销毁
2)不立即销毁 :当函数执行完成的时候,会返回一个函数的定义阶段,這个返回的函数还需要再次调用,只有等所有的函数都调用完成,這个大函数才能销毁
this的总结
this的总结
1)当元素身上的事件被触发的时候,会执行一个函数,函数中的this;指向当前這个元素
2)函数被调用的时候,看前面是否有..点前面是谁,this就是谁--没点就是window
3)自执行函数中的this,永远都是window 定时器种的this一般默认为window (自执行函数就是匿名函数)
4)回调函数中的this一般默认为window
5)构造函数中的this 永远是实例
6)当遇到apply,bind,call的时候,以上统统失效
||或者 &&并且
12:||或者 &&并且
|| 或者 只要有一个真 整体即为真
&& 并且 两边的小条件都为真,整体即为真
先算且&& 再算或||
- 1.且和或的用法:
+ &&:前面为真,才会走后面;
+ cb && cb();
+ ||:前面为假,才会走后面;
+ var l=left||200;
+ &&如果两边为具体的值:(为假的值:0 '' null NaN undefined)
如果第一个为真 返回第二个
如果第一个为假 返回第一个
+ ||如果两边为具体的值:(为假的值:0 '' null NaN undefined)
如果第一个为真 返回第一个
如果第一个为假 返回第二个
+ && ||如果两边为条件 返回false 或者true