apply,call,bind區別

来源:https://www.cnblogs.com/yangkun90/archive/2019/03/03/10464572.html
-Advertisement-
Play Games

js中有三個改變this指針的方法,分別是 apply,call,bind。很多人只知道能改變的this,但是具體的適用場景不是太清楚。我也是遇到坑後不斷的實踐發現了區別。 call ,apply方法: 在Food類中,因為使用了call改變類Product的類的this執向。所以這個時候在Prod ...


js中有三個改變this指針的方法,分別是 apply,call,bind。很多人只知道能改變的this,但是具體的適用場景不是太清楚。我也是遇到坑後不斷的實踐發現了區別。

call ,apply方法:

 1 function Product(name, price) {
 2   this.name = name;
 3   this.price = price;
 4 }
 5 
 6 function Food(name, price) {
 7   Product.call(this, name, price);
  
8 this.category = 'food'; 9 } 10 11 console.log(new Food('cheese', 5).name); 12 // expected output: "cheese"

在Food類中,因為使用了call改變類Product的類的this執向。所以這個時候在Product 中this定義的兩個私有屬性卻成了Food類new出來對象的。這種方式實現了類似繼承的概念,這種方式叫做call繼承。

其中call第一個參數表示的是修改的類的this指向值,後面兩個name,price都是做為參數傳遞到Product中。最後在執行這條語句的時候,會執行一下Product這個類(函數)。也就是call就會執行一下 ‘’.‘’ 符號之前的類或者函數。

apply相對call來說也是執行了一下函數或者類,只是參數傳遞進行了組裝。如果要進行apply修改,第7句話就可以表達為 Prpduct.apply(this,[name,price]); 可以把要傳遞的參數進行數組化。

bind:

bind是es6中新推出的修改this的方法。但是他和傳統的call,apply區別就是函數或者類的this修改後沒有執行,而是在程式代碼檢測時已經對代碼的this指向進行了修改。那麼有什麼用呢?

比如我這個時候需要用DOM2級別的事件綁定 :

document.addEventListener('click',fn);
fn(){
this.name='yangkun'
}
//這裡我們給document元素對象添加了一個點擊事件方法fn;
var obj={name:'zhansan'};
fn.call(obj);
我們需要的是修改fn中的this,指向是obj中的name.是如果這樣做,會有一個問題就是,函數fn已經被執行了!實際上我們綁定的click事件對應的是一個函數返回值(這裡沒有返回值,實際上點擊事件綁定了null),而不是我們希望綁定的方法!

這個時候如果我們使用fn.bind(obj)就沒問題了。方法沒有執行。

 

後記:JavaScript早期版本沒有類,但是大家發現通過new可以實現類似後臺語言的語法方式。自然把進行new 的函數說成類。  js 函數有三態,普通函數,類,對象。這個是ES6之前函數的三態。


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

-Advertisement-
Play Games
更多相關文章
  • 從sqlplus命令行中向資料庫中導入數據: ...
  • Linux基礎之LSB定義的基本目錄詳解 1、LSB中FHS(Filesystem Hierarchy Standard)定義的一些文件 /boot:主要是存放引導文件的目錄,比如內核文件(vmlinuxz)、引導載入器的靜態文件(bootloader、grub),一般這個目錄是一個獨立分區 /bi ...
  • Flexbox頁面佈局實例,成本效果圖如下, 源碼下載在最下麵。 源碼下載:https://pan.baidu.com/s/18o5hVuWtflUpgvMk3LzQ5w 提取碼:wiyc樣本地址:http://tpl.zhuamimi.cn/%E6%89%8B%E6%9C%BA%E7%AB%AF% ...
  • 最近實習生招聘已經開始了,昨天晚上也終於迎來了第一場筆試,筆試的公司是cvte,筆試題總共27題,25道不定項還有2道編程題,雖然出的都是前端題,但是因為之前沒有好好準備,還是很多做的不是很好o(╥﹏╥)o考完試後也總結了一下,考的以node,原型,promise比較多,之前以為自己原型掌握的還可以 ...
  • 大致步驟: 1、寫一個p標簽,指定一個id選擇器,輸入數字! 2、寫一個input標簽,指定type屬性的屬性值為button,創建一個按鈕,加入onclick事件! 3、為p標簽和input標簽指定相關的CSS樣式(可以省略) 4、用js創建一個自加的函數,在函數中用document對象的getE ...
  • 回調函數作為參數傳給另一個函數,所以我們在調用回調函數時,預先並不知道所調用的函數具體是哪個函數,因為我們調用的是一個參數,形如: 普通函數是通過具體的函數名來調用,所有我們在調用普通函數時,預先知道要調用的是哪個函數,形如: ...
  • 彈性容器單行:主軸居中,交叉軸居中。 彈性容器單行;主軸兩端對齊;交叉軸一個為起點邊緣;一個為終點邊緣; 單選;主軸兩端對齊;交叉軸一個為起點邊緣;一個為居中對齊;一個為終點邊緣; 1:彈性視窗設置為多行,交叉軸為兩端對齊 2:每行基礎大小設置為100%,然後每個子行主軸為兩端對齊 在4的基礎上增加 ...
  • align-content 和 align-items : 1:共同點:它們對齊方向為交叉軸 2:不同點:align-content 應用於為 多行 而 align-items:應用於單行。 單行對齊例子: 多行對齊例子 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...