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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...