9月阅读周·JavaScript权威指南:语句,声明语句篇
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。
这个“玩法”虽然常见且板正,但是有效,已经坚持阅读七个月。
已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》。
当前阅读周书籍:《JavaScript权威指南》。
声明语句
var
var语句用来声明一个或者多个变量,它的语法如下:
var name_1[=value_1][,...,name_n[=value_n]]
关键字var之后跟随的是要声明的变量列表,列表中的每一个变量都可以带有初始化表达式,用于指定它的初始值,例如:
var i;//一个简单的变量
var j=0;//一个带有初始值的变量
var p,q;//两个变量
var greeting="hello"+name;//更复杂的初始化表达式
var x=2.34,y=Math.cos(0.75),r,theta;//很多变量
var x=2,y=x*x;//第二个变量使用了第一个变量
var x=2,//更多变量
f=function(x){return x*x},//每一个变量都独占一行
y=f(x);
如果var语句出现在函数体内,那么它定义的是一个局部变量,其作用域就是这个函数。如果在顶层代码中使用var语句,它声明的是全局变量,在整个JavaScript程序中都是可见的。全局变量是全局对象的属性。然而和其他全局对象属性不同的是,var声明的变量是无法通过delete删除的。
如果var语句中的变量没有指定初始化表达式,那么这个变量的值初始为undefined。变量在声明它们的脚本或函数中都是有定义的,变量声明语句会被“提前”至脚本或者函数的顶部。但是初始化的操作则还在原来var语句的位置执行,在声明语句之前变量的值是undefined。
需要注意的是,var语句同样可以作为for循环或者for/in循环的组成部分(和在循环之外声明的变量声明一样,这里声明的变量也会“提前”)。
for(var i=0;i<10;i++)console.log(i);
for(var i=0,j=10;i<10;i++,j--)console.log(i*j);
for(var i in o)console.log(i);
注意,多次声明同一个变量是无所谓的。
function
关键字function用来定义函数。函数定义也可以写成语句的形式。例如,下面示例代码中的两种定义写法:
var f=function(x){return x+1;}//将表达式赋值给一个变量
function f(x){return x+1;}//含有变量名的语句
函数声明语句的语法如下:
function funcname([arg1[,arg2[...,argn]]]){
statements
}
funcname是要声明的函数的名称的标识符。函数名之后的圆括号中是参数列表,参数之间使用逗号分隔。当调用函数时,这些标识符则指代传入函数的实参。
函数体是由JavaScript语句组成的,语句的数量不限,且用花括号括起来。在定义函数时,并不执行函数体内的语句,它和调用函数时待执行的新函数对象相关联。注意,function语句里的花括号是必需的,这和while循环和其他一些语句所使用的语句块是不同的,即使函数体只包含一条语句,仍然必须使用花括号将其括起来。
下面是一些函数声明的例子:
function hypotenuse(x,y){
return Math.sqrt(x*x+y*y);//下一节会讲到return
}
function factorial(n){//一个递归函数
if(n<=1)return 1;
return n*factorial(n-1);
}
函数声明语句通常出现在JavaScript代码的最顶层,也可以嵌套在其他函数体内。但在嵌套时,函数声明只能出现在所嵌套函数的顶部。也就是说,函数定义不能出现在if语句、while循环或其他任何语句中,正是由于函数声明位置的这种限制,ECMAScript标准规范并没有将函数声明归类为真正的语句。有一些JavaScript实现的确允许在出现语句的地方都可以进行函数声明,但是不同的实现在细节处理方式上有很大差别,因此将函数声明放在其他的语句内的做法并不具备可移植性。
尽管函数声明语句和函数定义表达式包含相同的函数名,但二者仍然不同。两种方式都创建了新的函数对象,但函数声明语句中的函数名是一个变量名,变量指向函数对象。和通过var声明变量一样,函数定义语句中的函数被显式地“提前”到了脚本或函数的顶部。因此它们在整个脚本和函数内都是可见的。使用var的话,只有变量声明提前了——变量的初始化代码仍然在原来的位置。然而使用函数声明语句的话,函数名称和函数体均提前:脚本中的所有函数和函数中所有嵌套的函数都会在当前上下文中其他代码之前声明。也就是说,可以在声明一个JavaScript函数之前调用它。
和var语句一样,函数声明语句创建的变量也是无法删除的。但是这些变量不是只读的,变量值可以重写。
总结
var和function都是声明语句,它们声明或定义变量或函数。这些语句定义标识符(变量名和函数名)并给其赋值,这些标识符可以在程序中任意地方使用。声明语句本身什么也不做,但它有一个重要的意义,通过创建变量和函数,可以更好地组织代码的语义。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)