编程语言是干什么的:处理数据或按照某种逻辑来处理数据;

数据是程序里最基本的“生产生活资料”;

数据的管理方法,给数据起一个名字:变量;

变量

数据和变量是两个不同的概念,但是表示的东西相同,殊途同归;(变量和数据是两码事)

JS里的变量类型是由分配数据的时候决定的(赋值后才决定的)

所谓的变量类型,就是数据类型!

认识数据和管理数据:因为数据要分类,方便管理,所以要有数据类型;

其他强类型语言,定义前,直接固定类型,分配好内存,以后数据类型就不能改了;

而JavaScript是弱类型语言;强类型语言,变量类型是要事先指定的;

若类型的是赋值后才有类型的;

变量的声明和赋值是分开的;

函数的定义;

变量声明有两种,一个是var,另外一个是函数;

预解释

带var关键字的:

1、代码运行之前,预解释,先扫描一遍有没有带var关键字的脚本,先去内存里给变量开一个空间,这会的变量是没有值(预解释阶段变量没有数据),用undefined表示,undefined表示不存在的标示(仅仅是一个记号),【声明】;

2、当代码运行的时候,则给数据开一个内存空间;

3、让变量和数据关联在一起(定义);

带function关键字的;

在代码执行之前,把所有带function关键字的扫描一遍,然后定义变量,并且同时给变量赋值;

预解释不管if条件是否成立,都是会进行预解释的;

作用域

作用域,闭包;开辟一个新的栈内存;栈内存里还会有预解释之类的一套流程;

预解释是在各自的预解释里进行的;互不干扰;

对象也可以是作用域的;

var ele=document.getElementById("div1");
with(ele.style){//
这里的作用域就是ele.style;对象也可以是一个作用域的;
width="100px";
height="100px";
background="#FFF";
}

with里不要用var,加了var还是全局的;不会注册到ele.style,直接写就可以了;with能不用尽量不用,容易混乱;

活动对象

函数的运行是有什么周期的内存地址

或者说函数运行时,会创建一个内存地址,当此函数运行结束时,此内存地址又会销毁,这个地址,我们无法保存,它的灵活的,活动的,有生命周期的;(函数内返回值是引用数据类型,并且外面有变量接收时候不销毁;)

函数里的变量,就在这个内存里创建,我们可以把这个内存当成一个对象,那函数里的变量就是这个对象的属性;

闭包:可以简单的理解为作用域就是闭包;闭包是机制而不是形式;不是概念;使用闭包还不如说直接使用作用域;可以保护好变量,避免变量污染;但是闭包内有引用数据类型,如果有变量接收,这种的闭包不销毁;注意这点就好;(所有函数的运行都是闭包,因为他们都产生了一个小的栈内存);但是浪费性能是必须的,JS到处都是作用域,选项卡的效果,产生的闭包就不能销毁;因为函数绑定到oLis.onclick上的;浏览器不是服务器,所以性能不像后台那么严格; 浏览器只要不写死循环,不写死递归;不会有事的;

闭包优点

1、保护代码

2、闭包不仅可以保护内部变量同时可以和外部友好沟通,因为他可以留接口(通道)–参数

3、协调异步代码;

for(var i=0;i<oLis.length;i++){
;(
function(i){
oLis[i].onclick=function(){
alert(i);
}
})(
i);//这了的i就是处理异步的;
}

定时器中的闭包应用

<!doctype html>
<
html>
<
head>
<
meta charset="UTF-8">
<
title>Document</title>
<
style>
#ul1 li{
width: 100px;height: 40px;background: orange;margin-bottom: 10px;
position: relative;left: 10px;
}
</
style>
</
head>
<
body>
<
ul id="ul1">
<
li>11111</li>
<
li>22222</li>
<
li>33333</li>
<
li>44444</li>
<
li>55555</li>
<
li>66666</li>
</
ul>
</
body>
</
html>
<
script>
var oLis=document.getElementById("ul1").getElementsByTagName("li");
for(var i=0;i<oLis.length;i++){
;(
function(i){
window.setTimeout(function(){
oLis[i].style.left=(i+1)*100+"px"
},(i+1)*1000);
})(
i)
};
</
script>

闭包和预解释的思考题:

f=function(){return true};
g=function(){return false
};
(
function(){
if(g()&&[]==![]){//一元运算符优先级最高;==会隐形转换;相当于g()&&true;
f=function f(){return false;};//f是全局变量
function g(){return true;};//g是局部变量的,并非是全局的;
}
})();
alert(f());//false
。闭包内的东西成全局的了,对全局变量污染了
alert(g());//false,全局的变量;和闭包没有关系

setTimeout知识点:

1、传fn还是fn(),这里如果想传参,就需要用返回值的形式的(或者外面套一个函数),如果直接用并且传参,会直接执行,定时器就没意义了;

window.setTimeout(fn,1000);//这时候表示一秒钟以后,执行fn
window.setTimeout(fn(),1000);//这时候表示一秒钟以后,执行fn的返回结果,如果fn的返回结果是一个值就没意义的;

window.setTimeout(function(){fn(9)},1000);//这样就可以传参了;

function fn(i){alert("fn"+i)};
window.setTimeout(fn,1000);//fnundefined
window.setTimeout(function(){fn(9)},1000);//fn9

 

2、定时器的异步的,是在函数执行以后,才会开始执行定时器内的代码;即时定时器设置的时间是0;

异步不是一个队列的,是异步的 ;

~~~~~~