前言:
浏览器组成:
(1)shell部分
(2)内核部分:渲染引擎、js引擎和其他模块。
javascript特点:单线程、解释性语言、脚本语言。
-
typeof六种数据类型:number、String、Boolean、undefined、object、function
-
parseInt作用:
(1)把数字转化为整型
(2)目标进制作为基底转化为十进制。parseInt(num,radix),radix的范围是2~36。 -
toString作用:
(1)把值转化为字符串形式。undefind和null不能用toString,会报错。(数字).toString
(2)以十进制为基底转化为目标进制。demo.toString(radix) -
预编译
(1)形参和arguments是一一对应的。实参列表arguments是类数组。
(2)函数预编译:函数声明整体提升,变量 声明提升。
预编译四步:
-
[ 1] 创建AO对象。
-
[ 2] 找形参和变量声明,将变量和形参名作为AO的属性名,值为undefined。
-
[ 3] 将实参和形参统一。
-
[ 4] 在函数体里找函数声明,值赋予函数体。
注:变量未经声明就赋值(var),此变量就为全局变量所有。一切声明的全局变量,全是window属性。
(3)全局预编译
步骤: -
[ 1] 创建GO对象。GO===window
-
[2 ] 找变量声明,将变量名作为GO的属性名,值为undefined。
-
[ 3] 找函数声明,值赋予函数体。
5.闭包
当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。
闭包的作用:
(1)实现公有变量,比如函数累加器。
<script type="text/javascript">
function add(){
var count = 0;
function demo(){
count ++;
console.log(count);
}
return demo;
}
var counter = add();
counter();
counter();
counter();
</script>
(2)可以做缓存(存储结构)
<script type="text/javascript">
function eater(){
var food = "";
var obj = {
eat:function (){
console.log("I am eating" + food);
food = "";
},
push:function (myFood){
food = myFood;
}
}
return obj;
}
var eater1 = eater();
eater1.push("banana");
eater1.eat();
</script>
(3)可以实现封装,属性私有化(经典例子:圣杯模式)。
<script type="text/javascript">
function inherit(target,origin){
function F(){};
F.prototype = origin.prototype;
target.prototype = new F();
target.prototype.constructor = target;
target.prototype.uber = origin.prototype;
}
</script>
(4)模块化开发,防止污染全局变量。
<script type="text/javascript">
var init = (function(){
var name = 'abc';
function callName(){
console.log(name);
}
return function(){
callName();//留出一个函数作为接口,return出去,调用init()时,就调用了callName()函数
}
})
init();//相当于入口函数
</script>
注:当输出的东西本来想按照顺序输出的,结果输出了同样的数,多半就是闭包的问题,要用立即执行函数解决。
6.立即执行函数
立即执行函数是针对初始化功能的函数,不占用内存空间。
写法:(1)(function(){})
w3c组织建议的写法;(2)(function(){})()
。
注:只有表达式才能被执行符号执行。