JavaScript中的函数

函数范例

函数实际上是对象,由于每一个函数都是Function这个组织函数的实例,具有Funtion组织函数定义的属性和要领。函数名实际上时指向函数对象的指针,申明这个题目,看以下代码:

    function sum(a,b) {
        return a + b;
    }
    // 相当于把sum的援用地点通报给sum2。
    // 注重:不带圆括号的函数名是接见函数指针,而非挪用函数
    var sum2 = sum; 
    sum2(1,2) // 3
    sum = null;
    sum(2,3) // undefined // 将sum的内存接纳,即sum的援用地点变了
    sum2(2,3) //5 // 但sum2 照样指向本来的内存地点
  

1. 没有重载

明白了上面以后,重载相当于给函数变量从新修改了援用的值,因而后面会掩盖前面的,很轻易明白了。

2.函数提拔

实在和变量提拔相似,就是声明型函数和表达式定义函数的区分,很简单

3.作为值的函数

由于函数名自身是变量,所以能够作为值举行通报,这里有一个很好的例子,也是一个很好的编程头脑,以下:

function getSomeFunction(fn,arg) {
    return fn(arg);
} 
function add(num) {
    return num + 10;
}
function getGreeting(name) {
    return `Hello ${name}`;
}
getSomeFunction(add,5) // 15
getSomeFunction(getGreeting,'andy') // Hello andy

还能够从一个函数中返回另一个函数。比方我们在用数组的一些排序要领或许迭代要领的时刻,由于通报进去的都是一个函数变量作为参数,所以这个参数我们能够用“外部函数返回函数”的要领举行编写,如许做的优点是,返回的函数能够把我们”特定想要划定”的参数通报进去举行盘算,比方

// 划定应用哪一个属性举行排序,假如不填则代表数组从大到小排序
function sortArgFuntion(compareProperty) { //compareProperty是上文中特定想要划定的参数

    return function (val1, val2) {
        if (compareProperty === undefined) {  // 假如排序的是数组的值,则用通例的要领
            if (val1 > val2) {
                return 1;
            } else if (val1 < val2) {
                return -1;
            } else {
                return 0;
            }
        } else {    // 假如排序的是对象的属性则用该要领
            if (val1[compareProperty] > val2[compareProperty]) {
                return 1;
            } else if (val1[compareProperty] < val2[compareProperty]) {
                return -1;
            } else {
                return 0;
            }
        }

    }
}
var data = [{
    name: 'andy',
    age: 25
}, {
    name: 'Nf',
    age: 29
}]
data.sort(sortArgFuntion('name'))

sort函数的参数是个函数,用于将数组举行重排序。而我们将这个函数参数拿出来,就能够更直观的、复用性更高的去编写这个函数,到达我们想要的结果。同时须要细致琢磨,明白函数返回函数的精华和独到之处

4.函数内部属性

函数内部有两个特别变量

  • arguments
  • this

arguments

是类数组对象,作甚类数组对象呢?能够经由过程序号举行数组式的接见(如obj[1]),并且有length属性(对象你不定义length属性,是没有length的).类数组只要索引值和长度,没有数组的种种要领,所以假如要类数组挪用数组的要领,就须要运用Array.prototype.method.call 来完成

this

this是JavaScript异常轻易殽杂和庞杂的一个知识点,他代表什么完整取决于挪用位置,我会但列出一篇总结this。e.g:

window.color = 'red';
var o = {color:"blue"};
function sayColor() {
    console.log(this.color)
}
sayColor(); // red 由于挪用位置是全局
o.sayColor = sayColor;
o.sayColor(); // blue 由于挪用位置是o的对象里

从上面例子中我们要知道,函数名字仅仅是一个指针,虽然实行环境差别,全局的sayColor()和函数中的o.sayColor()指向的都是同一个函数

caller

es5新加的,他返回当前函数(必需是函数,对象不可)的挪用环境,假如挪用环境是全局,则返回null。有两种用法,一种是函数名加caller,一种是arguments.callee.caller

    function outer() {
        console.log(outer.caller); //null
        inner();
    };
    function inner() {
        console.log(inner.caller); // outer里的代码
    }

5.函数的属性和要领

由于函数也是对象,所以也有属性和要领;函数内里有length和prototype两个属性,length指传入形参的个数
function add(num1,num2) {} console.log(add.length) // 2

propertype(转头好好研讨一番)

关于援用范例而言,propertype是保留一切实例要领的真正地点。在建立自定义援用范例以及完成继续,它的作用及其症结(究竟多症结临时还不太明白,尤其是继续这个词:)) es5中propertype不可枚举,因而不能遍历。

apply() 和 call()

两个参数,第一个参数是在哪一个作用域运转,第二个参数apply是传入的Array或许arguments对象,call是传入每一个值,其他他俩如出一辙。这是个中一个例子,用来申明apply和call的作用:

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

假如不必call的话我们须要如许做:

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

所以对照能够一览无余,call一个最大的作用是完成了对象和要领的解耦

bind要领

bind要领用来构建一个函数的实例,其this对象指向bind划定的作用域。e.g:

    var color = "red";
    var obj = {color:"blue"}
    function sayColor() {
        console.log(this.color);
    }
    var bindSayColor = sayColor.bind(obj);
    bindSayColor(); // blue
    原文作者:andy00614
    原文地址: https://segmentfault.com/a/1190000015877227
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞