成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript中的函數(shù)

red_bricks / 3462人閱讀

摘要:函數(shù)類型函數(shù)實(shí)際上是對(duì)象,因?yàn)槊總€(gè)函數(shù)都是這個(gè)構(gòu)造函數(shù)的實(shí)例,具有構(gòu)造函數(shù)定義的屬性和方法。而我們將這個(gè)函數(shù)參數(shù)拿出來,就可以更直觀的復(fù)用性更高的去編寫這個(gè)函數(shù),達(dá)到我們想要的效果。

函數(shù)類型

函數(shù)實(shí)際上是對(duì)象,因?yàn)槊總€(gè)函數(shù)都是Function這個(gè)構(gòu)造函數(shù)的實(shí)例,具有Funtion構(gòu)造函數(shù)定義的屬性和方法。函數(shù)名實(shí)際上時(shí)指向函數(shù)對(duì)象的指針,說明這個(gè)問題,看如下代碼:

    function sum(a,b) {
        return a + b;
    }
    // 相當(dāng)于把sum的引用地址傳遞給sum2。
    // 注意:不帶圓括號(hào)的函數(shù)名是訪問函數(shù)指針,而非調(diào)用函數(shù)
    var sum2 = sum; 
    sum2(1,2) // 3
    sum = null;
    sum(2,3) // undefined // 將sum的內(nèi)存回收,即sum的引用地址變了
    sum2(2,3) //5 // 但sum2 還是指向原來的內(nèi)存地址
  
1. 沒有重載

理解了上面之后,重載相當(dāng)于給函數(shù)變量重新修改了引用的值,因此后面會(huì)覆蓋前面的,很容易理解了。

2.函數(shù)提升

其實(shí)和變量提升類似,就是聲明型函數(shù)和表達(dá)式定義函數(shù)的區(qū)別,很簡單

3.作為值的函數(shù)

因?yàn)楹瘮?shù)名本身是變量,所以可以作為值進(jìn)行傳遞,這里有一個(gè)很好的例子,也是一個(gè)很好的編程思想,如下:

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

還可以從一個(gè)函數(shù)中返回另一個(gè)函數(shù)。例如我們?cè)谟脭?shù)組的一些排序方法或者迭代方法的時(shí)候,因?yàn)閭鬟f進(jìn)去的都是一個(gè)函數(shù)變量作為參數(shù),所以這個(gè)參數(shù)我們可以用“外部函數(shù)返回函數(shù)”的方法進(jìn)行編寫,這樣做的好處是,返回的函數(shù)可以把我們”特定想要規(guī)定”的參數(shù)傳遞進(jìn)去進(jìn)行計(jì)算,例如

// 規(guī)定利用哪個(gè)屬性進(jìn)行排序,如果不填則代表數(shù)組從大到小排序
function sortArgFuntion(compareProperty) { //compareProperty是上文中特定想要規(guī)定的參數(shù)

    return function (val1, val2) {
        if (compareProperty === undefined) {  // 如果排序的是數(shù)組的值,則用常規(guī)的方法
            if (val1 > val2) {
                return 1;
            } else if (val1 < val2) {
                return -1;
            } else {
                return 0;
            }
        } else {    // 如果排序的是對(duì)象的屬性則用該方法
            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函數(shù)的參數(shù)是個(gè)函數(shù),用于將數(shù)組進(jìn)行重排序。而我們將這個(gè)函數(shù)參數(shù)拿出來,就可以更直觀的、復(fù)用性更高的去編寫這個(gè)函數(shù),達(dá)到我們想要的效果。同時(shí)需要仔細(xì)揣摩,理解函數(shù)返回函數(shù)的精髓和獨(dú)到之處

4.函數(shù)內(nèi)部屬性

函數(shù)內(nèi)部有兩個(gè)特殊變量

arguments

this

arguments

是類數(shù)組對(duì)象,何為類數(shù)組對(duì)象呢?可以通過序號(hào)進(jìn)行數(shù)組式的訪問(如obj[1]),并且有l(wèi)ength屬性(對(duì)象你不定義length屬性,是沒有l(wèi)ength的).類數(shù)組只有索引值和長度,沒有數(shù)組的各種方法,所以如果要類數(shù)組調(diào)用數(shù)組的方法,就需要使用Array.prototype.method.call 來實(shí)現(xiàn)

this

this是JavaScript非常容易混淆和復(fù)雜的一個(gè)知識(shí)點(diǎn),他代表什么完全取決于調(diào)用位置,我會(huì)但列出一篇總結(jié)this。e.g:

window.color = "red";
var o = {color:"blue"};
function sayColor() {
    console.log(this.color)
}
sayColor(); // red 因?yàn)檎{(diào)用位置是全局
o.sayColor = sayColor;
o.sayColor(); // blue 因?yàn)檎{(diào)用位置是o的對(duì)象里

從上面例子中我們要知道,函數(shù)名字僅僅是一個(gè)指針,雖然執(zhí)行環(huán)境不同,全局的sayColor()和函數(shù)中的o.sayColor()指向的都是同一個(gè)函數(shù)

caller

es5新加的,他返回當(dāng)前函數(shù)(必須是函數(shù),對(duì)象不行)的調(diào)用環(huán)境,如果調(diào)用環(huán)境是全局,則返回null。有兩種用法,一種是函數(shù)名加caller,一種是arguments.callee.caller

    function outer() {
        console.log(outer.caller); //null
        inner();
    };
    function inner() {
        console.log(inner.caller); // outer里的代碼
    }
5.函數(shù)的屬性和方法

因?yàn)楹瘮?shù)也是對(duì)象,所以也有屬性和方法;函數(shù)里面有l(wèi)ength和prototype兩個(gè)屬性,length指?jìng)魅胄螀⒌膫€(gè)數(shù)
function add(num1,num2) {} console.log(add.length) // 2

propertype(回頭好好研究一番)

對(duì)于引用類型而言,propertype是保存所有實(shí)例方法的真正所在。在創(chuàng)建自定義引用類型以及實(shí)現(xiàn)繼承,它的作用及其關(guān)鍵(到底多關(guān)鍵暫時(shí)還不太理解,尤其是繼承這個(gè)詞:)) es5中propertype不可枚舉,因此不能遍歷。

apply() 和 call()

兩個(gè)參數(shù),第一個(gè)參數(shù)是在哪個(gè)作用域運(yùn)行,第二個(gè)參數(shù)apply是傳入的Array或者arguments對(duì)象,call是傳入每個(gè)值,其余他倆一模一樣。這是其中一個(gè)例子,用來說明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

所以對(duì)比可以一目了然,call一個(gè)最大的作用是實(shí)現(xiàn)了對(duì)象和方法的解耦

bind方法

bind方法用來構(gòu)建一個(gè)函數(shù)的實(shí)例,其this對(duì)象指向bind規(guī)定的作用域。e.g:

    var color = "red";
    var obj = {color:"blue"}
    function sayColor() {
        console.log(this.color);
    }
    var bindSayColor = sayColor.bind(obj);
    bindSayColor(); // blue

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96558.html

相關(guān)文章

  • JavaScript深入淺出

    摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...

    blair 評(píng)論0 收藏0
  • JS程序

    摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊?,否則只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

    melody_lql 評(píng)論0 收藏0
  • 學(xué)習(xí)React之前你需要知道的的JavaScript基礎(chǔ)知識(shí)

    摘要:和類在開始時(shí)遇到類組件,只是需要有關(guān)類的基礎(chǔ)。畢竟,中的條件呈現(xiàn)僅再次顯示大多數(shù)是而不是特定的任何內(nèi)容。 在我的研討會(huì)期間,更多的材料是關(guān)于JavaScript而不是React。其中大部分歸結(jié)為JavaScript ES6以及功能和語法,但也包括三元運(yùn)算符,語言中的簡寫版本,此對(duì)象,JavaScript內(nèi)置函數(shù)(map,reduce,filter)或更常識(shí)性的概念,如:可組合性,可重用...

    bitkylin 評(píng)論0 收藏0
  • JavaScript中的面向?qū)ο螅╫bject-oriented)編程

    摘要:對(duì)象在中,除了數(shù)字字符串布爾值這幾個(gè)簡單類型外,其他的都是對(duì)象。那么在函數(shù)對(duì)象中,這兩個(gè)屬性的有什么區(qū)別呢表示該函數(shù)對(duì)象的原型表示使用來執(zhí)行該函數(shù)時(shí)這種函數(shù)一般成為構(gòu)造函數(shù),后面會(huì)講解,新創(chuàng)建的對(duì)象的原型。這時(shí)的函數(shù)通常稱為構(gòu)造函數(shù)。。 本文原發(fā)于我的個(gè)人博客,經(jīng)多次修改后發(fā)到sf上。本文仍在不斷修改中,最新版請(qǐng)?jiān)L問個(gè)人博客。 最近工作一直在用nodejs做開發(fā),有了nodejs,...

    JerryZou 評(píng)論0 收藏0
  • 深入理解JavaScript,這一篇就夠了

    摘要:也就是說,所有的函數(shù)和構(gòu)造函數(shù)都是由生成,包括本身。如果只考慮構(gòu)造函數(shù)和及其關(guān)聯(lián)的原型對(duì)象,在不解決懸念的情況下,圖形是這樣的可以看到,每一個(gè)構(gòu)造函數(shù)和它關(guān)聯(lián)的原型對(duì)象構(gòu)成一個(gè)環(huán),而且每一個(gè)構(gòu)造函數(shù)的屬性無所指。 前言  JavaScript 是我接觸到的第二門編程語言,第一門是 C 語言。然后才是 C++、Java 還有其它一些什么。所以我對(duì) JavaScript 是非常有感情的,畢...

    villainhr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<