这是这个系列的第一课,我们来解释几个常见的概念:
程序
程序的本质其实是数据和指令的集合
指令暂时可以理解为就是定义变量,循环,判断等
数据我们经常接触,数据可以按照一定标准分类,比如我们可以按照它们在内存中存储的位置来分类,js中的数据分为两大类:基本类型、引用类型
可以理解为基本类型在栈空间存储,引用类型在堆空间存储
数据要有地方存放,下面即将要介绍的变量就可以存储数据
个人感觉:指令其实本质上也属于数据
语法
写程序不能随便写,要跟着标准走,例如写js的时候就要遵循ECMA给出的标准,否则会对解释器或编译器的翻译产生影响:
对于高级语言来说,程序是由语句构成的,语句可以一条一条写,每一条由分号结束:
var a = 1; a++;
也可以放到一个代码块中:
if(a == 1){ doSth1(); doSth2(); doSth3(); }
注意{}后面没有加分号,因为{}是用来包含多条语句的,{}并不是一条语句,而是一个语句块,因此{}后面不应该加分号
js中常见的语句块的场合有:if else do while for try catch 函数定义等,这些涉及到{}的场合后面都不应该加分号
虽然加了也没什么大碍,但是最好不要挑战编程语言和浏览器的容忍限度
变量
变量的本质是内存中的一块空间
对于基本类型,直接将值存进内存中即可,所谓基本类型:数字、字符串、布尔值、undefined、null
对于引用类型,变量所指向的内存中保存的是该对象在堆空间的地址
作用域
js中有3中作用域(注:ECMA5以前),分别是全局作用域、局部作用域、闭包
前两种实在没什么好说的,关键看第三种——闭包
先来看个小问题:
function test(){ // 如何能让test每执行一次,a的值自增1? var a = 1; }
大家可以带着这个问题往下看:
为了对比,先简单说一下局部作用域:局部作用域就是函数执行完之后里面定义的变量就从内存当中消失,但是有一种情况比较特殊,那就是闭包。
所谓闭包,可以理解为在函数里面定义的一个变量在函数运行结束后这个变量没有从内存中释放,但是又不能在函数外面直接通过访问这个变量的名字来拿到该变量,这就是闭包,闭包出现的场合举例:
function Aaa(){ var value = 1; this.setValue = function(v) { value = v; }; this.$get = function() { return value; }; } var a = new Aaa(); a.setValue(5); //外部依然可以用到内部的value,因此里面的value在Aaa执行完之后不会释放内存,这个value变量就是闭包
闭包的作用主要是为了保护变量,防止随便被修改,注意是随便被修改,而不是被修改,因为通过约定的方式还是可以修改的,例如上面的例子中在外面通过a实例调用里面的setValue方法时就可以改变Aaa构造函数里面的value变量的值
通过这样一番解释,刚才提出的问题自然就有了结果:
function test(){ // 如何能让test每执行一次,a的值自增1? var a = 1; return function (){ a++; }; } var add = test(); add(); //a将变为2 add(); //a将变为3
这样一来,基础知识介绍终于可以告一段落,下节课我们要介绍js中的重点——对象