美文网首页
《JavaScript高级程序设计》之函数类型

《JavaScript高级程序设计》之函数类型

作者: 柯基糖 | 来源:发表于2016-10-25 09:29 被阅读0次

函数类型

1.函数也是对象,并且函数名仅仅是指向函数的指针。

var sum=function(num1,num2){
    return num1+num2;
}
console.info(sum(10,20));//30

var anothersum=sum;
console.info(anothersum(10,20));//30

sum=null;
console.info(anothersum(10,20));//30

2.函数没有重载

3.函数声明和函数表达式的区别

在js中函数声明会在代码解析器一开始将函数声明体提升到顶部执行,因此即便调用函数语句在函数声明之前,也不会报错。

alert(sum(10,20));//不会出错
function sum(num1,num2){
    return num1+num2;
}

而函数表达式在定义函数的时候,必须要等到代码执行到表达以后,才能调用此函数。

alert(sum(10,20));//出错
var sum=function(num1,num2){
    return num1+num2;
}

4.作为值的函数

在js中,可以像传递参数一样,将一个函数传递给另一个函数,也可以将一个函数当作另一个函数的结果返回。如下

function callSomeFunction(someFunction,someArguments){
    return someFunction(someArguments);
}

var add10=function(num){
    return num+10;
}

alert(callSomeFunction(add10,10));//20

function greenting(name){
    return "Hello"+name;
}

alert(callSomeFunction(greenting,"tzw"));//"Hello tzw"

注意:因为函数变量是函数指针,因此在传递函数参数时,不需要写圆括号。

另外,一个函数也可以当作另一个函数的结果返回(典型的例子为创建一个比较函数)。例如如下:

    function createComparisonFunction(propertyName){
        return function(Oject1,Object2){
            var Value1=Object1[propertyName];
            var Value2=Object2[propertyName];
            
            if(Value1<Value2){
                return -1;//升序返回-1
            }else if(Value1>Value2){
                return 1;//降序返回1
            }else{
                return 0;
            }
        }
    }
  1. 函数的内部属性

函数内部有两个对象:arguments和this。arguments对象是用来保存函数参数,并且这个对象有一个名叫callee的属性,该属性是一个指针,是来指向该拥有arguments对象的函数。利用阶乘函数来看:

function factorial(num){
    if(num<=1){
        return 1;
    }else if(num>1){
        return num*arguments.callee(num-1);
    }
}

this是引用的是函数已执行的环境对象,当在网页的全局作用域中调用函数的话,则是指windows对象。

window.color="red";
var o={"color":"blue"};

function sayColor(){
  console.info(this.color);//red
}

o.sayColor=sayColor;
o.sayColor();//blue

还有一个特殊的属性:caller。这个属性保存着调用当前函数的函数引用。

function outer(){
    inner();
}

function inner(){
    console.info(inner.caller);
}

outer();

如果需要更加离散的耦合,则可以把inner替换成arguments.callee即可;

function outer(){
    inner();
}

function inner(){
    console.info(arguments.callee.caller);
}

outer();
  1. 函数的属性和方法

函数也是对象,所以函数也会包含属性和方法。每个函数包含两个属性:length和prototype。length:指定义的函数所能接受的参数的个数。每个函数也还有两个非继承而来的方法:apply()和call(),用来设置函数体内this对象的值。

apply()接受两个参数,第一个为运行的函数的作用域,第二个参数为参数数组。

function sum(num1,num2){
        return num1+num2;
}
function callsum1(num1,num2){
        return sum.apply(this,arguments);//传入arguments对象
}
function callsum2(num1,num2){
        return sum.apply(this,[num1,num2]);//传入参数数组
}
alert(callsum1(10,10));//20
alert(callsum2(10,10));//20

call方法同样也是有两个参数,第一个参数为this,运行函数的作用域,第二个参数就需要将所有参数逐一列出来。

function callsum3(num1,num2){
        return sum.call(this,num1,num2);//传入参数
}
alert(callsum3(10,10));//20

实际上apply和call真正常用来扩充函数运行的作用域。

window.color="red";
var 0={"color":"blue"};

function sayColor(){
    alert(this.color);
}

sayColor();//red

sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue

用call和apply最大的好处在于对象与方法不需要有耦合关系,之前还需要将方法放入对象中,再调用。现在只需要用call和apply就可以了。

另外,还提供了一个bind()方法,这个方法会创建一个函数(方法)的实例,他的this值会绑定到bind传入的参数。

window.color="red";
var 0={"color":"blue"};

function sayColor(){
    alert(this.color);
}
var objectSayColor=sayColor.bind(o);//this值绑定了o对象
objectSayColor();//blue

相关文章

  • 第3章: 基本概念

    2020-07-30学习JavaScript高级程序设计 笔录 语法 数据类型 流控制语句 函数 3.1.1: 函...

  • 参数按值传递

    参考 JavaScript深入之参数按值传递JavaScript高级程序设计(第3版) 基本类型 举个例子: 在此...

  • 《JavaScript高级程序设计》之函数类型

    函数类型 1.函数也是对象,并且函数名仅仅是指向函数的指针。 2.函数没有重载 3.函数声明和函数表达式的区别 在...

  • object 类型: tolocaleString 与 toSt

    今天看高程的书(《javascript高级程序设计》),对object类型中tolocaleString,toSt...

  • Javascript 基础

    1、函数防抖和函数节流 【《javascript高级程序设计》里,函数节流是这里讲的函数防抖。】函数防抖: 在事件...

  • JavaScript高级程序设计读书笔记之闭包

    ps:如无说明,下文中的“书”特指JavaScript高级程序设计这本书。 闭包:JavaScript高级程序设计...

  • JS高级函数

    高级函数 在 JavaScript 中使用函数的高级方法。 数据类型的安全检测 构造函数的安全作用域 惰性载入函数...

  • js红宝书笔记十一 第十章 函数 闭包

    本文继续对JavaScript高级程序设计第四版 第十章 函数 进行学习 一、创建函数 函数是ECMAScript...

  • JavaScript参数传递

    《javascript高级程序设计》4.1.3:所有函数的参数都是按值传递的就是说把函数外部的值赋值给函数内部的参...

  • JavaScript创建对象的高级方法

    创建对象的方法 读《JavaScript高级程序设计》所得。 工厂模式——》构造函数模式——》原型模式——》构造函...

网友评论

      本文标题:《JavaScript高级程序设计》之函数类型

      本文链接:https://www.haomeiwen.com/subject/lvjtuttx.html