1 作用域

语句块不会创建新的作用域。 意味着if,for语句块中声明的变量在外部也可以使用。

声明变量时如果没有写var那么就在全局作用域创建此变量。

函数内的变量声明在函数声明时进行, 变量的初始化在函数执行时进行。 解释器在载入函数声明时,如果函数内部声明了局部变量,会先创建局部变量,但不会初始化。之后在函数被调用时才对其初始化。

var a =1
function fn1() {
//函数被调用时此处执行,因为局部变量a存在,所以输出a的值:undefined。
alert(a); // undefined
//函数声明时,此局部变量被创建,但是不被初始化,其值为undefined
var a = 2;
//此时a的初始化已经完成,因此输出为2。
Alert(a); // 2
}
fn1();

2 声明

function a() {
}

Var a = function () {
}

3 匿名函数

function(){
}

4 自调函数

(function(){
})()

5 私有函数

function a(param){
function b(input){
return input * 2;
};
return "The result is " + b(param);
}

alert(a(2)); //The result is 4

6 私有函数的优点

有助于确保全局名字空间的纯净性(这意味着命名冲突的机会很小)。
私有性 - 只将一些必要的函数暴露给“外面世界”,并保留属于自己的函数,使它们不为该应用程序的其他部分所用。

7 arguments对象

function doAdd() {
if(arguments.length == 1) {
alert(arguments[0] + 5);
} else if(arguments.length == 2) {
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); //输出 "15"
doAdd(40, 20); //输出 "60"

8 回调函数

9 回调函数的优点:

  1. 它可以在不做命名的情况下传递函数(这意味着可以节省全局变量)。
  2. 可以将一个函数调用操作委托给另一个函数(这意味着可以节省一些代码编写工作)。
  3. 回调函数也有助于提升性能。(重要)

10 例子

Function add(a,b,c) {
Var I = 0;arr = [];
For (temp : arguments) {
Arr[i] = temp * 2;
}
Return arr;
}
Function kkk(a ) {
Return a + 1;
}
Arr = [];
Arr = Add(1,2,3);
For (temp : Arr){
Kkk(temp);
}

如上不使用回调,需要调用两次循环,效率低

如果使用回调,则

Function add(a,b,c, callback) {
Var I = 0;arr = [];
For (temp : arguments) {
Arr[i] = callback(temp * 2);
}
Return arr;
}
Arr = [];
Add(1,2,3,function(a){return a + 1;});

如上,可以看到只需要一次循环,效率高。