console.info(name);//undefined
console.info(getName);//getName()函数
console.info(getName());//undefined
try{
console.info(age);//异常
}catch(e){
console.info(e);//ReferenceError
}
console.info(getAge);//undefined
try{
console.info(getAge());//异常
}catch(e){
console.info(e);//TypeError
}
var name = 'linjisong';//变量声明,提升
age = 29;//直接使用全局变量,不提升
function getName(){//函数声明,提升
return name;
}
var getAge = function(){//变量getAge的声明,提升;获取年龄的匿名函数表达式,不提升
return age;
}
console.info(name);//linjisong
console.info(getName);//getName()函数
console.info(getName());//linjisong
console.info(age);//29
console.info(getAge);//获取年龄的匿名函数
console.info(getAge());//29
你有没有自己推断出上面的输出结果?如果已经推断出,可以跳过了,如果还存有疑问,那么先看看下面关于声明提升的描述,然后再回过头来印证上面的输出结果:
A、引擎在解析时,首先会解析函数声明,然后解析变量声明(解析时不会覆盖类型),最后再执行代码;
B、解析函数声明时,会同时解析类型(函数),但不会执行,解析变量声明时,只解析变量,不会初始化。
这里涉及的只是全局作用域,在函数作用域中还有函数参数也和声明提升有关,在后面讲述函数时再讨论。
上面的代码,首先会把第18行的函数声明和第16、21行的变量声明提升到最开始解析,然后再执行。因此第1、9行因为变量声明提升但尚未初始化,所以输出undefined,从而第11行因为无法确定是函数类型而抛出类型异常;第2、3行因为函数声明提升并且解析函数类型,所以第2行输出函数,第3行可以调用函数,但返回值未初始化而输出undefined;第5行因为尚未声明变量,会抛出引用异常。
(4)可以使用一条语句定义多个变量,用逗号分开即可。如:
复制代码 代码如下:
var,
age=29,
work='it';
(5)在ES5的严格模式下,不能定义名为eval或arguments的变量。
7、语句
(1)语句:以一个分号“;”结尾,如果省略分号,由解析器确定语句的结尾。
对于JS中语句可以省略分号的特性,我想不到任何存在的理由,强烈建议每条语句均使用分号来明确结束,不要让解析器花费时间来“猜测”你的程序,而且,更加重要的是,在很多压缩工具中,猜测并不能保证百分百的正确。
(2)代码块:以左花括号({)开始,右花括号(})结束。
在JS中虽然有代码块的概念,但是却没有相应的块级作用域,这是和一般类C语言所不同的。对于控制语句(比如if),不要因为只有一条语句就不使用代码块,这会给维护你程序的伙计种下犯错的种子。
复制代码 代码如下:
for(var i=0; i<10; i++)
{
}
console.info(i);//输出10,在代码块之后仍可以访问i,说明JS无块级作用域
if(i < 10)
//console.info(i); 不使用代码块,在维护时(比如添加1条语句)容易犯错
{
console.info(i);
}
花括号({})除了作为代码块来使用外,还有一个很重要的用处就是定义对象字面量,这在后面还会再有论述。
您可能感兴趣的文章: