一:函数是第一型对象.
对象具有以下特性,而函数拥有对象的全部属性:
- 他们可以通过字面量进行创建。
- 他们可以赋值给变量,数组,对象的属性。
- 他们可以作为参数传递给函数。
- 他们可以作为函数的返回值返回。
- 他们可以拥有动态创建并赋值的属性。
二:回调:我们定义一个函数,以便其他代码在合适的时候调用它。
- 事件处理函数在触发时被放在事件队列中,然后浏览器根据先进先出原则调用这些事件处理函数。由于事件的发生的时间和顺序都是不可预测的,所以事件处理函数的调用是异步的。从这个意义上说,事件处理函数是回调函数。
三:作用域
- 作用域是由function申明的,而不是由代码块申明的。申明的作用域创建于代码块,但不终结于代码块。
- 变量申明的作用域开始于申明的位置,结束于所在函数的结尾,与代码的嵌套无关。
- 命名函数的作用域是指申明该函数的整个函数范围,与代码嵌套无关------机制提升。
- 对于作用域申明,全局上下文就像一个包含页面所有函数的超大函数。
function outer(){
var a=1;
function inner(){};
var b=2;
var c=3;
}
assert(typeof outer==='function','outer() is in scope','outer() is out of scope');//outer() is in scope
assert(typeof inner==='function','inner() is in scope','inner() is out of scope');//inner() is out of scope
assert(typeof a==='number','a is in scope','a is out of scope');//a is out of scope
assert(typeof b==='number','b is in scope','b is out of scope');//b is out of scope
assert(typeof c==='number','c is in scope','c is out of scope');//c is out of scope
四:参数和调用
-
任何函数都会隐式的传入两个参数:arguments和this。
- arguments: 可以把arguments想象成一个数组进行处理,但是arguments不是一个数组。
- this: 是引用了与该函数调用隐式关联的一个对象,称之为函数上下文(调用上下文)
-
函数的4种调用方式:
- 作为函数调用:在函数上使用()操作符进行调用
- 作为方法调用:当函数被赋值给对象的一个属性时,并使用引用该函数的属性进行调用
- 作为构造器调用:将函数作为构造器调用,在函数调用前使用New关键字
- 使用apply()和call()调用:显式的指定一个对象作为其函数上下文
-
构造器函数:当函数作为构造器使用时,会发生以下特殊变化:
- 创建一个新的空对象。
- 传递给构造器的对象是this对象,从而成为构造器的函数上下文。
- 如果没有显式的返回,新创建的对象则作为构造器的返回值进行返回。
构造器的目的是创建一个新对象并对其进行设置,然后将其作为构造器的返回值进行返回,所以任何干扰这种意图的函数都不适合作为构造器。
-
函数调用与this参数:
- 作为函数调用:this是全局上下文,即window。
- 作为方法调用:this是方法所属的对象。以下几种作为方法调用的特殊情况:
- 如果把window看作一个对象,函数作为window的一个属性,那么作为函数调用其实是作为方法调用的一个特例。
- 函数作为事件处理函数时,事件是对象的一个方法。调用事件处理函数时事件处理函数里的this就是触发事件的对象本身。
- 函数作为请求的回调函数时,回调函数是请求的一个方法。调用回调函数时回调函数里的this就是请求本身。
- 作为构造器调用:this是构造对象本身。
- 使用apply()和call()调用:this是指定的上下文对象。