JS--函数

简述

  函数是一个对象,函数名是一个指针,每个函数都是Function类型的实例;

  函数是代码执行的主要模块化单元;

  也可以这样理解函数:在特定环境下执行代码的对象。

定义方式

  函数声明

function fun1(){
   console.log('fun1');
}

  函数表达式

var fun2 = function(){
    console.log('fun2');  
}

  自执行函数

(function(){
    console.log('fun3')
})

  Function构造函数(不推荐)

  tip:

    (1)函数声明与函数表达式的区别:

      解析器会率先读取函数声明,使它在代码执行之前可用;这里牵涉到一个概念叫函数声明提升;

      函数表达式则必须等到解析器执行到它所在的代码行才会真正的被解释执行。

函数的内部属性

    arguments

      (1)一个类数组对象,包含传入函数的所有参数,主要用来保存函数参数; (功能)

      (2)该对象又一个callee的属性,它是一个指针,指向拥有这个arguments对象的函数; 

        callee的主要用途:实现递归,消除函数内的代码与函数名的冲突; (callee属性)

      (3)可以像访问数组索引一样来获取单个参数,如arguments[0]获取第一个参数,arguments不是数组无法使用Array方法,

      通过Array.prototype.slice(arguments, 0)来实现arguments转换为Array对象; (arguments转换为Array)

      (4)arguments.length表示实际传入实参的个数,arguments.callee.length表示期望传入实参的个数 (length)

    this

      JS关键字,参照:JS--this

    length

      函数希望接受参数的个数,如function test(m1, m2, m3, ..., mn){}希望接受的参数个数为n个

    prototype

      指向一个对象的引用,这个对象称为原型对象;

      每个函数都包含一个原型对象,当这个函数为构造函数时,通过构造函数创建的对象会从原型对象上继承属性

函数的调用

  普通函数调用

  构造函数调用

  作为某个对象的方法调用

  call,apply间接调用

  

理解函数是第一级对象

  要理解函数是第一级对象,那么我们首先要知道对象能够做些什么。

  对象的功能:

    (1)可以通过字面量创建对象

    (2)可以赋值给其他变量、数组或其他任意对象的属性

    (3)可以作为函数的返回值

    (4)拥有动态创建并赋值的属性

  那么函数是否具有以上功能呢?看代码:

  

  对象通过字面量创建对象

  对象:

var person = {};

  函数:

function sayName(){
    console.log('sayName');
}

  可以赋值给其他变量、数组或其他任意对象的属性

  对象:

var person = {}; //对象赋值给一个变量
var personArr = [];
personArr.push({}); //对象赋值给一个数组
person.addr = {}; //对象赋值给一个对象的属性

  函数:

var fun = function(){
    console.log('fun');
} //函数赋值给一个变量

var funArr = [];
funArr.push(function fun(){console.log('fun')}); //函数赋值给一个数组

var person = {};
person.sayName = function(){
    console.log('sayName');
} //函数赋值给一个对象的属性

  可以作为函数的参数进行传递或者作为函数的返回值进行返回

  对象:

var person = {};
function setName (p){
    p.name = 'tom';
    return {name: 'tom'};    //对象作为函数的返回值进行返回
}
setName(person); //对象作为函数的参数进行传递

  函数:

function calNum(fun){
    fun();
    var sayNum = function(){
        console.log('sayNum');
   }  
    return   sayNum; //sayNum函数作为函数的返回值进行返回
}

var addNum = function(){
    console.log('addNum');
}

calNum(addNum); //addNum函数作为函数calNum的参数进行传递

  拥有动态创建并赋值的属性

  对象:

var person = {};
person.name = 'tom'; //为对象动态创建一个属性

  函数:

var sayName = function(){
    console.log('sayName');
}

sayName.funName = 'sayNumFun'; //为函数动态创建一个属性

  

  总结:

  函数拥有对象的全部这些功能,即函数可以当做其他任意类型的对象使用,此外函数还有一个特殊的功能:可以被调用;

  因此称函数为第一级对象。

原文地址:https://www.cnblogs.com/marton/p/10176873.html