国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

淺談細說 JS 函數(call,apply,重載)

U2FsdGVkX1x / 3196人閱讀

摘要:什么是函數引用的原話函數是一組可以隨時隨地運行的語句。函數是由這樣的方式進行聲明的關鍵字函數名一組參數,以及置于括號中的待執行代碼。

什么是函數?

引用 W3School 的原話:

函數是一組可以隨時隨地運行的語句。
函數是 ECMAScript 的核心。
函數是由這樣的方式進行聲明的:關鍵字 function、函數名、一組參數,以及置于括號中的待執行代碼。
函數的基本語法是這樣的:
function functionName(arg0, arg1, ... argN) {
  statements
}

聲明函數的幾種方式

調用函數的幾種方式

重載函數的實現

函數的獨立性

聲明函數

//聲明函數的4種方法

//方法一 直接聲明
function speak(word){
    console.log(word)
}

//方法二 指定一個匿名函數 將其賦給一個變量,后面可以直接通過該變量調用該函數
var speak2 = function (word) {
    console.log(word);
};//定義匿名函數需要注意最后需要加分號

//方法三 使用 Function對象 生成一個函數實例 
var speak3 = new Function("word","console.log(word);");

//方法四 使用 Function函數 返回函數實例
var speak4 = Function("word","console.log(word);");

調用函數基本方法

speak("hello world for global !");

this.speak("hello world for this !");

window.speak("hello world for window !");

調用函數的高級方法

speak.call(null,"hello world with call !");//null 代表是用全局對象 window 調用

speak.apply(null,["hello world with apply !"]);

輸出結果:

這里方法一大家不言而喻,簡單明了,直接就是聲明了一個函數,需要指出的是,默認寫的函數在不依附其他對象的情況下均為全局函數,即成為 window 對象的成員,可以直接使用 window(Window 對象的實例,Window 對象實現了核心 JavaScript 所定義的所有全局屬性和方法)調用,或者通過 this 調用,在這里JS 頂層代碼中 this 指向的就是 window

每當我們使用方法一聲明了一個函數的時候,實際是生成了一個 Function 對象的實例.即每個函數其實質都是一個 Function 對象實例.

注意:
JS 解析器每解析到一個函數的時候,都會在堆內存內劃分出一塊空間來存儲創建該 Function 實例

方法二:
首先 JS 解析器解析到一個函數的時候,在堆內存內劃分出一塊空間來存儲創建該 Function 實例,接著在當前棧內存
創建一個叫 speak2 的變量,這個變量有個值,這個值是一個地址,指向的是堆內存中的那個 Function 實例.實際上這就是大名鼎鼎的引用.

方法三:
與方法一和方法二不同的是,前兩個方法都是聲明好讓解析器去解析,讓解析器生成 Function 實例(就是上面聲明的函數,解析器調用 Function 構造器來生成實例,這些步驟是我們看不到的),方法三是我們手動調用 Function 構造器生成 Function 實例(步驟掌握在自己的手里)

方法四:
與方法三不同的地方就是沒有 new,在這里 new 與沒 new 的區別就是當有 new 的時候 Function 函數充當一個構造器,new 后返回的就是實例化后得到的對象(此時Function 內部的 this指向的就是當前生成的對象),不使用 new 的話就是把 Function 函數看做一個普通函數直接調用,直接調用 Function 函數讓其在內部(我們看不到)new 一個實例返回,本質是一樣的.

call方法與 apply 方法
查看EcmaScript.js

可以看到 call 方法與 apply 方法的區別:

他們的第一個參數指的是調用該方法對象

call 方法的第二個參數是可變數組參數,即可以傳入多個參數,非傳入一個數組.傳入的多個參數對應的是被調用方法的各參數.

apply 方法的第二個參數是一個數組對象,即可以直接傳入一個數組對象,數組對象的每項對應的是被調用的方法的各參數.

實現重載函數
在 JS 中,并不像其他強類型語言一樣可以聲明重載函數,若在原先聲明的函數后再聲明一個不同參數數量的函數(JS是弱語言, 聲明的函數不需要指明參數類型),解析器會用后面聲明的函數覆蓋前面聲明的函數.那我們該如何實現呢.

arguments 對象
在每個函數都有一個arguments 屬性,同樣查看 EcmaScript.js

當生成一個函數實例后,解析器會賦給arguments 屬性一個Arguments對象實例,這個實例是什么,再看 EcmaScript.js

可以得知其為一個對象同時為數組對象的子類,故可以將其當初數組對象使用.
函數實例中的 arguments對象(可以算是一個數組)的數組項內容便是我們在調用函數時進行傳遞的參數.只要我們有傳參,這個屬性就有數組項,否則數組長度為0,故我們可以通過arguments.length 來查看其得到的形參的數量.

有了上面的基礎便可實現重載函數
這里引用 W3School 的例子

function doAdd() {
  if(arguments.length == 1) {
    alert(arguments[0] + 5);
  } else if(arguments.length == 2) {
    alert(arguments[0] + arguments[1]);
  }
}

doAdd(10);        //輸出 "15"
doAdd(40, 20);    //輸出 "60"

函數的獨立性
我們都知道,每當我們聲明了一個函數,其實際為一個 Function 實例,那它獨立在哪呢,如何體現呢
看一下代碼:

function Dog(name,age){
    this.name = name;
    this.age = age;
    this.showName = function () {
        console.log(this.name);
    }
}

function Cat(name,age){
    this.name = name;
    this.age = age;
    this.showName = function () {
        console.log(this.name);
    }
}

var dog = new Dog("wangwang",2);
var cat = new Cat("miaomiao",3);

dog.showName();
cat.showName();
dog.showName.call(cat);

輸出結果為:

解釋:
每當我們在函數內使用 this 的時候,無非這幾種情況:
1.作為構造器生成的實例對象
2.作為調用當前方法的對象
3.在 JS 頂層代碼可以使用 this 代表 window 調用全局函數等

故當我們使用 call 方法調用某個對象的方法時,雖然從代碼語義上看,這個所屬方法是屬于該對象的(showName 屬于 Dog 或 Cat),但是由于函數有用其特殊的獨立性即有以上幾個關于 this 的特點,導致最終的結果是不同的.
當我們直接調用 dog 的 showName 方法時,showName 方法內的 this 指向的是該dog 對象(Dog 實例).

我們知道調用 call 方法時需要傳入的第一個參數即為調用當前函數亦或方法的對象,此時被調用的方法的 this 指向的實際為傳入的第一個參數.即當我們通過 call 調通 dog 的 showName 方法時,傳入的第一個參數是 cat 對象,代表 dog 的 showName 方法的 this 此時指向的不是 dog 是 cat.最后輸出的當然是 cat 的內容

最后指出:在對函數進行傳參時,若傳的是 JS 的基本類型,則為值傳遞,否則為引用傳遞.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86053.html

相關文章

  • 10個JavaScript難點

    摘要:每個構造函數都有一個屬性,用于設置所有實例對象需要共享的屬性和方法。憑直覺,函數重載可以通過或者實現,這就不去管它了。自從年雙十一正式上線,累計處理了億錯誤事件,得到了金山軟件等眾多知名用戶的認可。 譯者按:能夠讀懂這篇博客的JavaScript開發者,運氣不會太差... 原文: 10 JavaScript concepts every Node.js programmer must ...

    anquan 評論0 收藏0
  • Backbone.js學習筆記(二)細說MVC

    摘要:因為是一條數據記錄,也就是說,相當于是一個數據集。通常我們需要重載函數,聲明,以及通過或為視圖指定根元素。通過綁定視圖的函數到模型的事件模型數據會即時的顯示在中。實例屬性參數以及類屬性參數會被直接注冊到集合的構造函數。 對于初學backbone.js的同學可以先參考我這篇文章:Backbone.js學習筆記(一) Backbone源碼結構 showImg(https://segme...

    taoszu 評論0 收藏0
  • 淺談框架和庫的區別

    摘要:只是站在初學者的角度,對框架和庫的區別有自己的認識和見解。庫的使用非常靈活,但沒有框架方便,這就是框架和庫本質的區別??蚣芎蛶斓膮^別庫是將代碼集合成的一個產品,供程序員調用。 什么是框架和庫? 初識框架和庫 對于好多初學者來說(例如我),很容易把框架和庫搞混淆,分不清它們的具體區別,直到現在我也不是把框架和庫搞得很清晰。只是站在初學者的角度,對框架和庫的區別有自己的認識和見解。所以今...

    reclay 評論0 收藏0
  • js基礎深入淺出

    摘要:當多個事件觸發的時候,會把異步事件依次的放入里等同步事件執行完之后,再去隊列里一個個執行拾遺常用方法總結面試的信心來源于過硬的基礎參考高級程序設計你所不知道的深入淺出知識點思維導圖經典實例總結那些剪不斷理還亂的關系 持續不斷更新。。。 基本類型和引用類型 vue props | Primitive vs Reference Types 基本類型和字面值之間的區別 基本類型和字面值相等,...

    phodal 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<