JS之函数基本知识

139 阅读3分钟

一:函数是第一型对象.

对象具有以下特性,而函数拥有对象的全部属性:

  • 他们可以通过字面量进行创建。
  • 他们可以赋值给变量,数组,对象的属性。
  • 他们可以作为参数传递给函数。
  • 他们可以作为函数的返回值返回。
  • 他们可以拥有动态创建并赋值的属性。

二:回调:我们定义一个函数,以便其他代码在合适的时候调用它。

  • 事件处理函数在触发时被放在事件队列中,然后浏览器根据先进先出原则调用这些事件处理函数。由于事件的发生的时间和顺序都是不可预测的,所以事件处理函数的调用是异步的。从这个意义上说,事件处理函数是回调函数。

三:作用域

  • 作用域是由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。

    1. arguments: 可以把arguments想象成一个数组进行处理,但是arguments不是一个数组。
    2. this: 是引用了与该函数调用隐式关联的一个对象,称之为函数上下文(调用上下文)
  • 函数的4种调用方式:

    1. 作为函数调用:在函数上使用()操作符进行调用
    2. 作为方法调用:当函数被赋值给对象的一个属性时,并使用引用该函数的属性进行调用
    3. 作为构造器调用:将函数作为构造器调用,在函数调用前使用New关键字
    4. 使用apply()和call()调用:显式的指定一个对象作为其函数上下文
  • 构造器函数:当函数作为构造器使用时,会发生以下特殊变化:

    • 创建一个新的空对象。
    • 传递给构造器的对象是this对象,从而成为构造器的函数上下文。
    • 如果没有显式的返回,新创建的对象则作为构造器的返回值进行返回。

    构造器的目的是创建一个新对象并对其进行设置,然后将其作为构造器的返回值进行返回,所以任何干扰这种意图的函数都不适合作为构造器。

  • 函数调用与this参数:

    1. 作为函数调用:this是全局上下文,即window。
    2. 作为方法调用:this是方法所属的对象。以下几种作为方法调用的特殊情况:
      • 如果把window看作一个对象,函数作为window的一个属性,那么作为函数调用其实是作为方法调用的一个特例。
      • 函数作为事件处理函数时,事件是对象的一个方法。调用事件处理函数时事件处理函数里的this就是触发事件的对象本身。
      • 函数作为请求的回调函数时,回调函数是请求的一个方法。调用回调函数时回调函数里的this就是请求本身。
    3. 作为构造器调用:this是构造对象本身。
    4. 使用apply()和call()调用:this是指定的上下文对象。