声明&表达式
-
格式
函数声明
function print(s) {
console.log(s);
}
函数表达式
var print = function(s) {
console.log(s);
};
-
调用
函数声明 作用域内调用
函数表达式 只在声明后调用
-
提升
函数声明 将整个函数代码块提升至作用域最顶部
函数表达式 只提升 被声明的变量,不提升函数
-
分号
函数声明 可加可不加
函数表达式 必须加分号来表示结束
声明前置
-
变量
因为JS引擎的工作方式是先解析代码获取所有被声明的变量,然后逐行运行。
所以所有的变量的声明语句都会被提升到代码顶部。
-
函数
因为JS引擎 将函数名视同变量名,所以
采用function命令声明函数时,整个函数被提升到代码头部。
采用赋值语句声明函数时,函数在原位置被声明。
arguments
- arguments是一个对象。这个对象只有在函数体内部,才可以使用。
- 由于JS允许函数有不定数目的参数,所以我们需要一种机制,可以在函数体内部读取所有参数。
- arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。
重载
-
定义
允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数必须不同
-
作用
解决功能类似 但 处理的数据类型不同的问题。
-
实现
在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面的,但是可以用arguments模拟函数重载
function foo() {
if(arguments.length == 1) {
alert(arguments[0] + 1);
} else if(arguments.length == 2) {
alert(arguments[0] + 2);
}
}
foo(1); //输出 “2”
foo(2, 3); //输出 “4”
立即执行函数表达式
-
语法
(function sum(i){ })( ); (function sum(i){ }( )); var a= function sum(i){ }( );
-
定义
一种声明之后就立即进行该函数执行操作的函数
即 声明一个匿名函数并立刻调用
-
作用
1 不必为函数命名,避免了污染全局变量;
2 函数内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。
Tip 通常只对匿名函数使用
作用域链
- 作用域是指 变量存在的范围
由于变量分为全局变量和局部变量,作用域相应分为全局作用域和局部作用域 - 作用域链是指 子对象在找不到相关变量时,会一级一级地向上寻找所有父对象的变量 的这种行为