js中的4種函數調用模式:函數調用、方法調用、構造器調用、間接調用

来源:https://www.cnblogs.com/7qin/archive/2018/09/07/9606463.html
-Advertisement-
Play Games

js中的4種函數調用模式 javascript一共有4種調用模式:函數調用模式、方法調用模式、構造器調用模式和間接調用模式。 【1】函數調用模式 當一個函數並非一個對象的屬性時,那麼它就是被當做一個函數來調用的。對於普通的函數調用來說,函數的返回值就是調用表達式的值 使用函數調用模式調用函數時,非嚴 ...


js中的4種函數調用模式

javascript一共有4種調用模式:函數調用模式、方法調用模式、構造器調用模式和間接調用模式。

【1】函數調用模式

  當一個函數並非一個對象的屬性時,那麼它就是被當做一個函數來調用的。對於普通的函數調用來說,函數的返回值就是調用表達式的值

function add(x,y){
    return x+y;
}
var sum = add(3,4);
console.log(sum)//7

使用函數調用模式調用函數時,非嚴格模式下,this被綁定到全局對象;在嚴格模式下,this是undefined

function add(x,y){
    console.log(this);//window
}    
add();
function add(x,y){
    'use strict';
    console.log(this);//undefined
}    
add();//window

因此,’this’可以用來判斷當前是否是嚴格模式

var strict = (function(){return !this;}());

重寫

因為函數調用模式的函數中的this綁定到全局對象,所以會發生全局屬性被重寫的現象 
  

var a = 0;
function fn(){
    this.a = 1;
}
fn();
console.log(this,this.a,a);//window 1 1

【2】方法調用模式

當一個函數被保存為對象的一個屬性時,我們稱它為一個方法。當一個方法被調用時,this被綁定到該對象。如果調用表達式包含一個提取屬性的動作,那麼它就是被當做一個方法來調用

var o = {
    m: function(){
        console.log(1);
    }
};
o.m();//1

方法可以使用this訪問自己所屬的對象,所以它能從對象中取值或對對象進行修改。this到對象的綁定發生在調用的時候。通過this可取得它們所屬對象的上下文的方法稱為公共方法。

var o = {
    a: 1,
    m: function(){
        return this;
    },
    n: function(){
        this.a = 2;
    }
};
console.log(o.m().a);//1
o.n();
console.log(o.m().a);//2

任何函數只要作為方法調用實際上都會傳入一個隱式的實參——這個實參是一個對象,方法調用的母體就是這個對象,通常來講,基於那個對象的方法可以執行多種操作,方法調用的語法已經很清晰地表明瞭函數將基於一個對象進行操作

rect.setSize(width,height);
setRectSize(rect,width,height);

  假設上面兩行代碼的功能完全一樣,它們都作用於一個假定的對象rect。可以看出,第一行的方法調用語法非常清晰地表明這個函數執行的載體是rect對象,函數中的所有操作都將基於這個對象

  和變數不同,關鍵字this沒有作用域的限制,嵌套的函數不會從調用它的函數中繼承this。如果嵌套函數作為方法調用,其this的值指向調用它的對象。如果嵌套函數作為函數調用,其this值不是全局對象(非嚴格模式下)就是undefined(嚴格模式下)

var o = {
    m: function(){
         function n(){
             return this;
         }
         return n();
    }
}
console.log(o.m());//window
var o = {
    m: function(){
         function n(){
             'use strict';
             return this;
         }
         return n();
    }
}
console.log(o.m());//undefined

  如果想訪問這個外部函數的this值,需要將this的值保存在一個變數里,這個變數和內部函數都同在一個作用域內。通常使用變數self或that來保存this

var o = {
    m: function(){
        var self = this;
        console.log(this === o);//true
         function n(){
             console.log(this === o);//false
             console.log(self === o);//true
             return self;
         }
         return n();
    }
}
console.log(o.m() === o);//true

【3】構造函數調用模式

  如果函數或者方法調用之前帶有關鍵字new,它就構成構造函數調用


function fn(){
    this.a = 1;
};
var obj = new fn();
console.log(obj.a);//1

  如果構造函數調用在圓括弧內包含一組實參列表,先計算這些實參表達式,然後傳入函數內

function fn(x){
    this.a = x;
};
var obj = new fn(2);
console.log(obj.a);//2

  如果構造函數沒有形參,javascript構造函數調用的語法是允許省略實參列表和圓括弧的。凡是沒有形參的構造函數調用都可以省略圓括弧

var o = new Object();
//等價於
var o = new Object;

  [註意]儘管構造函數看起來像一個方法調用,它依然會使用這個新對象作為調用上下文。也就是說,在表達式new o.m()中,調用上下文並不是o

var o = {
    m: function(){
        return this;
    }
}
var obj = new o.m();
console.log(obj,obj === o);//{} false
console.log(obj.constructor === o.m);//true

  構造函數通常不使用return關鍵字,它們通常初始化新對象,當構造函數的函數體執行完畢時,它會顯式返回。在這種情況下,構造函數調用表達式的計算結果就是這個新對象的值

function fn(){
    this.a = 2;
}
var test = new fn();
console.log(test);//{a:2}

  如果構造函數使用return語句但沒有指定返回值,或者返回一個原始值,那麼這時將忽略返回值,同時使用這個新對象作為調用結果

function fn(){
    this.a = 2;
    return;
}
var test = new fn();
console.log(test);//{a:2}

  如果構造函數顯式地使用return語句返回一個對象,那麼調用表達式的值就是這個對象

var obj = {a:1};
function fn(){
    this.a = 2;
    return obj;
}
var test = new fn();
console.log(test);//{a:1}

【4】間接調用模式

  javascript中函數也是對象,函數對象也可以包含方法。call()和apply()方法可以用來間接地調用函數

  這兩個方法都允許顯式指定調用所需的this值,也就是說,任何函數可以作為任何對象的方法來調用,哪怕這個函數不是那個對象的方法。兩個方法都可以指定調用的實參。call()方法使用它自有的實參列表作為函數的實參,apply()方法則要求以數組的形式傳入參數

var obj = {};
function sum(x,y){
    return x+y;
}
console.log(sum.call(obj,1,2));//3
console.log(sum.apply(obj,[1,2]));//3

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • @property : iOS6 引入關鍵詞. @property name; 指示編譯器自動生成 name 的 setter 和 getter 方法 : - (NSString *)name; - (NSString *)name { return _name; } - (void)setName ...
  • 項目迭代開發的過程中,有用戶反映保存圖片到相冊崩潰,最終自己測試出,在iOS11以下的手機正常保存,而iOS11之後的手機則會出現反映的問題.列印錯誤信息如下: Google翻譯: 此應用程式已崩潰,因為它嘗試訪問隱私敏感數據,而無需使用說明。應用程式的Info.plist必須包含一個NSPhoto ...
  • 在OC中,字元串、數組、字典是最常見的對象類型,但是在這三個當中,字典的用法相對較少,因為字典的屬性和方法比較少,但是一個字典的用法比較複雜,因為在一個字典當中,既可以包含字元串,也可以包含數組,數組裡面的值是有序的,字典裡面的鍵值對是沒有序的,所以字典的使用往往和其他對象類型的使用混雜在一起,熟練 ...
  • 有話要說: 本篇主要總結了簡單的Android與js互相調用的方法。 在開發過程中遇到了需要在安卓中調用js方法的需求,於是將具體的實現過程總結成這篇博客。 效果: 其中“調用安卓方法”按鈕是html中的按鈕;“調用JS方法”按鈕是app中的按鈕。 本地HTML: 首先,在app根目錄新建一個ass ...
  • 函數是JavaScript中很重要的一個語言元素,並且提供了一個function關鍵字和內置對象Function,下麵是其可能的用法和它們之間的關係。 function使用方式 最普通的function使用方式,定一個JavaScript函數。兩種寫法表現出來的運行效果完全相同,唯一的卻別是後一種寫 ...
  • 我們在WEB開發時,很多時候往往需要我們 JavaScript 來動態建立 html 元素,動態的設置相關的屬性。比方說我們想要建立一個 div 層,則可以使用以下代碼實現。 一.直接建立function Button1_onclick() //直接採用代碼建立一個DIV{ var newEleme ...
  • 關於彈性佈局: display:flex;很好用,將元素放在一排,盒子可用寬度百分比,可替代浮動,雖然浮動也能做到,但是還要清除浮動,多此一舉,還可以實現居中等佈局效果,但有相容性問題,特別是justify-content:space-between,除了新版chrom瀏覽器,其它瀏覽器都不相容,具 ...
  • 1 前言 項目需要用nodejs伺服器給前端傳遞圖片,網上找了好多資料,多數都是怎麼在前端上傳圖片的,然後通過看runoob.com菜鳥教程,發現其實是非常簡單,用express框架就行了。 2 代碼 2.1 用原生的版本(包含了返回網頁功能) ? 1 2 3 4 5 6 7 8 9 10 11 1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...