参数 arguments
当一个函数被调用时候,会得到一个argments数组的参数。通过它函数可以访问所有它被调用时传递给他的参数列表,包括没有在函数定义时定义的多余参数。
这个arguments不是真正的数组,只有一个length的属性,并且能够通过index遍历。
返回 return
return语句用于返回。
如果没有指定返回值,则返回undefined。
如果函数用new方式来调用,且返回值不是对象,那么返回this(该新对象)。
异常 Exception
var add = function (a, b)
{
if(typeof a != 'number' || typeof b != 'number')
{
throw {name: 'TypeError', message: 'add needs members'};
}
}
var try_it = function ()
{
try {
add("sevem", "ee");
}
catch(e)
{
alert(e.name);
}
}();
给类型增加方法
Function.prototype.method = function (name, func)
{ if(!this.prototype[name])
{
this.prototype[name]=func;
return this;
}
};
Number.method('ins', function(){
return 2;
});
(3).ins();// value is 2.
作用域 scope
js有函数的作用域,所以定义在函数中的参数和变量在函数外部是不可见的。而且在一个函数中的任何位置定义的变量在该函数中的任何地方都可见。
在js上不用尽可能迟的申明变量,而最好的做法是在函数体的顶部声明函数中可能用到的所有变量。
js 只有两种环境,一种是全局环境,一种是函数环境。就是说除了函数,其他情况下的大括号都起不了域的作用,外部环境都可以访问大括号内部的变量。
在函数中的this对于函数调用方式的不同分别有不同的含义。对于方法调用模式,即函数为某个对象的方法,那么this代表对象本身。对于函数调用模式,this是全部对象,即window。对于构造器调用模式,this是prototype所指向的对象。对于Apply/call调用,this可以通过第一个参数指定。
闭包 closure
作用域的好处就是内部的函数可以访问定义它们的外部函数的参数和变量(除了this和arguments)。
1、作为一个函数变量的一个引用,当函数返回时,处于激活状态。
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
3、闭包能够保证内部变量不被直接暴露出去。被外部使用。
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c();
如上代码所示,c的变量实际上是指向了函数b,b中用到了变量i。当函数a内部的函数被函数外部的一个变量引用的时候,就创建了一个闭包。
所以闭包的作用就是在函数a执行完并且返回后,使得GC不会回收a所占的资源。这个描述不够严谨,但是非常直白。
为了更好的解释闭包,引入:函数的执行环境(excution context)、活动对象(call object)、作用域(scope)、作用域链(scope chain) 这四个概念。
当定义a时,解释器会将a的scope chain 设置为定义a的时候a所在的环境,因为a是全局函数,所以a的scope chain中只有window对象。 当执行a时,a会进入相应的excution context。 在创建执行环境的过程中,会为a添加一个scope属性,即a的作用域,就是在定义a时scope chain 中的window对象。 然后excuation context会创建一个 call object。活动对象也是拥有属性的对象。但是没有原型也不能通过js直接访问。之后把该活动对象添加到a的scope chain的最顶端。这个时候a的scope chain就具备了两个对象。然后在call object上添加arguments属性,保存了调用函数a时所传递的参数。最后把所有函数a的形参和内部参数也添加到a的活动对象上。
因为该函数可以访问它被创建时所处的上下文环境。这被称为闭包。
回调 Callbacks
把函数作为参数传递给函数,它将在收到响应时被调用。
模块 Module
我们可以用函数和闭包来构造模块。模块是一个提供接口却隐藏状态与实现的函数或对象。
级联 Cascade
方法返回this而不是undefined.