函数
在 JavaScript 世界中函数是一等公民,它不仅拥有一切传统函数的使用方式(声明和调用),而且可以做到像简单值一样赋值、传参、返回,这样的函数也称之为第一级函数(First-class Function)。不仅如此, JavaScript 中的函数还充当了类的构造函数的作用,同时又是一个 Function 类的实例( instance)。这样的多重身份让 JavaScript 的函数变得非常重要。
//定义一个函数
var a = function(val) {
return val;
};
console.log(a); //函数当作参数传递
a(2); //函数当作方法执行
JavaScript中所有的函数都可以进行命名。但是有一点很重要,就是你要能区分出函数名与变量名。
var a = function a(){
return 'function' == typeof a; //=>true
}
this、.call、.apply
下述 a() 被调用时this指向的是全局变量 window ( Node 环境下是 global ):
function a() {
return window == this;
}
a(); //=>true
this 的值可以通过 .call 和 .apply 方法来改变:
function a() {
return this.b == 'hello';
}
a.call({ b: 'hello' });
.call 和 .apply 方法不同之处在于,.call 接受参数列表,而 .apply 则是参数列表数组:
function a(b, c) {
return b + c + this.d;
}
a.call({ d: '!' }, 'hello', ' World'); //=>hello World!
a.apply({ d: '!' }, ['hello', ' World']); //=>hello World!
函数的参数数量
在 JavaScript 函数有一个很有意思的属性——参数数量,该属性指明了函数声明时可接受多少个参数,在目前很多框架中就根据这个属性,根据不同参数数量提供不同的功能。在 JavaScript 中,该属性名为:
var a = function(a, b, c) {};
a.length; //=>3
闭包
闭包的原理就是在 JavaScript 中,每次函数调用时,新的作用域就会产生:
var a = 5;
function af() {
a == 5; //=>false
var a = 6;
function bf() {
a == 6; //=>true
}
bf();
}
af();
自执行函数是一种机制,通过这种机制声明和调用一个匿名函数,能够达到仅定义一个新的作用域的作用:
var a = 3;
(function() {
var a = 5;
})();
a == 3; //=>true
自执行函数对声明私有变量时非常有用的,这样就可以让私有变量不被其他代码访问。