JavaScript基础知识整理(引用类型-Function)

Function

Function类型实际上是对象,每个函数都是Function类型的实例,自然也就具有属性和方法。


定义函数通常有三种方式

使用函数声明

function sum(num1,num2){
    return num1 + num2;  
}    

使用函数表达式

var sum = function(num1,num2){
      return num1 + num2;  
};    

使用Function构造函数(因为解析代码次数会增加,所以不推荐用这种方式)

var sum = new Function("num1","num2","return num1 + num2");//最后一个参数作为函数体,其余参数为创建函数的参数

函数声明方式声明的函数会先被解析器读取,在其他代码执行前,这种函数已经处于能被访问的状态了


 函数名实际上是指向函数对象的指针,所以函数名和函数并没有互相绑定,多个函数名可以指向同一个函数,在其他oo语言中会有函数重载,ECMAScript中并没有,因为当出现具有相同名称而内容不同的函数时,函数名指向了最新的函数,也就不存在同时表示多个函数体的情况了。

var sum = function(num1,num2){
     return num1 + num2;
}
alert(sum(5,5));//10
var anotherSum = sum;
alert(anotherSum(5,5));//10
sum = null;
alert(anotherSum(5,5));//10
var add = function(num){
      return num + 100;  
};    
var add = function(num){
      return num + 200;     
};
var result = add(100);//300

函数作为变量可以作为参数传递给另一个函数,也可以通过函数返回一个函数

function callSomeFunction(someFunction,someArgument){
        return someFunction(someArgument);
}
function add(num){
        return num + 10;
}    
var result = callSomeFunction(add,10);//20

函数内部有三个特殊对象,arguments,this,caller.arguments作为一个与数组类似的对象,保存着传给函数的参数,并且拥有一个callee属性,指向函数本身。

这个callee属性可以解除函数名与函数体的耦合。(通常在函数调用本身时发挥作用)

function factorial(num){
       if(num <= 1){
              return 1;
       }else{
              return num * arguments.callee(num - 1); //不仅仅把函数名局限于factorial
       }
}                    
var newFactorial = factorial;
factorial = new function(){
        return 0;
}
alert(newFactorial(5));//120
alert(factorial(5));//0

this对象引用的是函数的运行环境对象

window.color = "red";
var o = {color : "green"};
function sayColor(){
      alert(this.color);  
}    
o.sayColor = sayColor();
sayColor();//"red"
o.sayColor();//"green"

 caller属性保存着调用当前函数的函数的引用,也就是上一级函数的引用。


函数拥有两个非继承属性和三个非继承方法分别是length,prototype,apply(),call()和bind().

length表示函数希望接收的命名参数的个数,prototype是一个指向函数原型的指针,这在模拟继承上有很大的作用。

apply()和call()可以让函数作用在某个特定的作用域,这样可以扩充函数能够运行的作用域。

apply()接收两个参数,第一个参数是指定函数在哪个作用域中调用,第二个参数是参数数组(可以是Array的实例也可以是arguments对象)。

function sum(num1,num2){
       return num1 + num2;
}
function callSum1(num1,num2){
       return sum.apply(this,arguments);      
}
function callSum2(num1,num2){
       return sum.apply(this,[num1,num2]);      
}
alert(callSum1(5,5));//10
alert(callSum2(5,5));//10

call()与apply()基本相同,不同之处在于接收参数的方式,call()接收参数时,必须把参数逐个列举出来,老老实实一个对应一个。

function sum(num1,num2){
       return num1 + num2;
}
function callSum(num1,num2){
       return sum.call(this,num1,num2);      
}
alert(callSum(5,5));//10

bind()可以创建一个函数实例,这个实例改变了其函数的this,让其this指向传给bind()的参数

window.color = "red";
var obj = {color : "green"};
function sayColor(){
      alert(this.color);  
}
var objSayColor = sayColor.bind(obj);
objSayColor();//"green"
原文地址:https://www.cnblogs.com/xianglan666/p/12968871.html