大家好,我从今天开始就会正式讲javascript的语法方面。
变量
js中的变量一般使用var来声明(es6的let不在本教程讨论范围内),可以用来定义任何种类的变量,如果只对变量进行了定义而没有赋值,这样变量会默认为undefined。
var a=100;
var b="hello,world";
var c=true;
变量提升
在js中,用var定义的变量会出现提升的效果,变量一般会提升到所在作用域的最顶部,简单来说就是,如果变量在函数中,就会提升到函数最顶部,如果在全局作用域(window)中,就会提升到所有代码的最顶部。
这里给一个例子:
console.log(a);
var a=100;
//输出结果为undefined
这里实际上真正的代码是:
var a;
console.log(a);
a=100;
因为a提升到顶部后未被赋值,所以最后会输出undefined,而且亲测严格模式下变量提升不会受到影响。
(提升:在js中多次声明一个变量,只有最后一次声明有效)
没有块级作用域
任何一对花括号中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域
在java和c等语言中,块级作用域的效果很明显,比如下面这段代码:
#include <stdio.h>
void main()
{
int i=2;
i--;
if(i)
{
int j=3;
}
printf("%d/n",j);
}
运行这段代码,会出现错误。可以看到,C语言拥有块级作用域,因为j是在if的语句块中定义的,因此,它在块外是无法访问的。
但是在js中就不是这样了:
for(var i=0;i<3;i++){}
console.log(i); //输出3
所以在js里面并没有块级作用域,它只有函数作用域,在函数内部用var定义的变量不能被外部访问到,因为函数调用结束后,变量会被自动销毁。
(提示:在函数内部不用var直接声明的变量会默认为全局变量,比如:test=100;这个test在函数外部依然能被访问到,因为默认为全局变量,但是在严格模式下这样声明一个变量会出错)
那么如何实现块级作用域呢?
在js中有一种立即执行的函数,在里面定义的变量一般不会泄露到外界,由于这里还没有讲函数,所以我只稍微提一下,以后再好好讲。
我只是把js每个部分的重点理清一下,具体的还是需要大家自己去看,比如关键字,注释,区分大小写等等,这套教程只适合在零碎时间去看,如果大家能有所收获,我就很满足啦。