call / apply / bind

對于 call / apply / bind 來說,他們的首要目的是用于改變執行上下文的 this 指針。

call / apply

對 call / apply 的使用,一般都如下,用于改變執行環境的上下文。只是 call 接受的是一個一個的參數,而 apply 則是接受的是一個參數數組。

const obj1 = {a: 1,myFunc(var1) {console.log(this.a + var1)}
}
const obj2 = {a: 2
}const myFunc = obj1.myFuncmyFunc(1)                 // NaN
obj1.myFunc(1)            // 2
myFunc.call(obj2, 1)      // 3
myFunc.apply(obj2, [1])   // 3

bind

bind 是 ES2015 出的一個方法,也是用于改變函數內部的 this 指向。但不一樣的是,bind 方法不是直接執行的,而是生成一個新的已被改變過的函數。

const obj1 = {a: 1,myFunc(var1) {console.log(this.a + var1)}
}
const obj2 = {a: 2
}const myFunc = obj1.myFunc
const bindMyFunc1 = myFunc.bind(obj1)
const bindMyFunc2 = myFunc.bind(obj2)myFunc(1)         // NaN
bindMyFunc1(1)    // 2
bindMyFunc2(1)    // 3

通過上面的例子就可以看出來,bind 方法就可以生成一個新的 this 指向的 function。

手動寫 bind 函數

僅僅作為簡單實現的話,我們僅需要注意改變 this 指向和預置參數即可。

function bind(fn, _this, ...args) {if(typeof fn !== 'function') {throw new Error('bind fn need to be function')}return function(...innerArgs) {return fn.apply(_this, [...args, ...innerArgs])}
}

當然這個手動實現的 bind 方法是只實現了最主要的功能,對函數的原型鏈和作為構造函數的方式都是沒有考慮到的。這里可以參考 MSDN 的 polyfill 方法。

if (!Function.prototype.bind) {Function.prototype.bind = function(oThis) {if (typeof this !== 'function') {// closest thing possible to the ECMAScript 5// internal IsCallable functionthrow new TypeError('Function.prototype.bind - what is trying to be bound is not callable');}var aArgs   = Array.prototype.slice.call(arguments, 1),fToBind = this,fNOP    = function() {},fBound  = function() {// this instanceof fBound === true時,說明返回的fBound被當做new的構造函數調用return fToBind.apply(this instanceof fBound? this: oThis,// 獲取調用時(fBound)的傳參.bind 返回的函數入參往往是這么傳遞的aArgs.concat(Array.prototype.slice.call(arguments)));};// 維護原型關系if (this.prototype) {// Function.prototype doesn't have a prototype propertyfNOP.prototype = this.prototype; }// 下行的代碼使fBound.prototype是fNOP的實例,因此// 返回的fBound若作為new的構造函數,new生成的新對象作為this傳入fBound,新對象的__proto__就是fNOP的實例fBound.prototype = new fNOP();return fBound;};
}

轉載于:https://www.cnblogs.com/YikaJ/p/10683142.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248169.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js(Dom+Bom)第八天—Swiper(插件)

Swiper插件(庫) 01-基本介紹 Swiper 是一款免費以及輕量級的移動設備觸控滑塊的js框架,使用硬件加速過渡(如果該設備支持的話)。主要使用于移動端的網站、移動web apps,native apps和hybrid apps。主要是為IOS而設計的&#xff…

第七節:EF Core調用SQL語句和存儲過程

一. 查詢類(FromSql) 1.說明 A. SQL查詢必須返回實體的所有屬性字段。 B. 結果集中的列名必須與屬性映射到的列名相匹配。 C. SQL查詢不能包含關聯數據 D. 除Select以為的其它SQL語句無法運行。 2.調用SQL語句的幾種情況 A. 基本的原生SQL查詢 B. 利用$內插語法進行傳遞 C. 原生…

沒用的一些水貨

1. 不遞歸的子函數加上inline會跑的很快。 2. 在稠密圖中用dijkstra堆優化會導致跑的很慢。 3. 連著開幾個數組的話,有可能越界了評測機卻返回WA。 4. 如果你用的Dev-C,那么有的時候會出現一些莫名其妙的編譯錯誤。請檢查是否存在未關閉的代碼生成的.exe…

js(Dom+Bom)第八天

JavaScript 移動端事件介紹 touch事件類型 移動設備上無法使用鼠標,當手指按下屏幕的時候會觸發 click,mousedown,mouseup事件,但是在移動設備上有專門的事件: touch 備注: 在移動端touch事件需要通過事件監聽的方式添加touchsta…

程序員計算器HEX、EDC、OCT等等的意思

binary 二進制 對應的是 BINoctal 八進制的 ---- OCThexadecimal 十六進制的 --- HEXdecimal 十進制的 -- DEC 轉載于:https://www.cnblogs.com/132818Creator/p/11459984.html

為什么mysql 5.7.24啟停不顯示錯誤信息?log-error_verbosity參數

關鍵詞:log-error_verbosity ,mysql啟停沒有信息,mysql啟停不顯示錯誤信息,mysql不顯示啟停信息 原因就是因為 log-error_verbosity 2 被設置成了1/2,需要設置成3才行。 轉載自:https://www.cnblogs.com/k…

ASP.NET Core 3.0中使用動態控制器路由

原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 譯文:https://www.cnblogs.com/lwqlun/p/11461657.html 譯者:Lamond Lu 譯者注 今天在網上看到了這篇關于ASP.NET Core動態路由的文章,感覺蠻有意思…

Petrozavodsk Winter Camp, Warsaw U, 2014, A The Carpet

一個地圖上有若干障礙&#xff0c;問允許出現一個障礙的最大子矩形為多大&#xff1f; 最大子矩形改編 #include<bits/stdc.h> using namespace std; #define rep(i, j, k) for (int i int(j); i < int(k); i) #define dwn(i, j, k) for (int i int(j); i > int…

d3.js 教程 模仿echarts折線圖

今天我們來仿echarts折線圖,這個圖在echarts是折線圖堆疊&#xff0c;但是我用d3改造成了普通的折線圖&#xff0c;只為了大家學習&#xff08;其實在簡單的寫一個布局就可以&#xff09;。廢話不多說商行代碼。 1 制作 Line 類 class Line {constructor() {this._width 1100;…

vue中v-for的使用

本人正在開始學習Vue,每天寫寫基礎的記錄,希望對大家有幫助,如有錯誤還望指出,我也是一個小白,也希望大家能一起進步 v-for指令的使用: 1.循環普通數組 item in list 中的item是自己個想寫什么名寫什么名 另一種寫法 i 表示索引值 2.循環對象數組 3.循環普通對象 4.迭代數字 注…

js高級第一天

JavaScript面向對象 1.1兩大編程思想&#xff1a; 1、面向過程 ? 面向過程&#xff1a;POP(Process-oriented programming) 面向過程就是分析出解決問題所需要的步驟&#xff0c;然后用函數把這些步驟一步一步實現&#xff0c;使用的時候再一個一個的依次調用就可以了。 ?…

d3.js 教程 模仿echarts legend功能

上一節記錄沒有加上echarts的legend功能&#xff0c;這一小節補一下。 1. 數據 我們可以從echarts中看出&#xff0c;折線數據并不是我們傳進入的原始數據&#xff08;多數情況下我們也不會修改原始數據&#xff09;&#xff0c;而是原始數組的一個備份而已。備份數組的方法有很…

小程序2-基本架構講解(一)WXSS樣式

項目里邊生成了不同類型的文件: .json 后綴的 JSON 配置文件.wxml 后綴的 WXML 模板文件.wxss 后綴的 WXSS 樣式文件.js 后綴的 JS 腳本邏輯文件WXSS 樣式 WXSS (WeiXin Style Sheets)是一套樣式語言&#xff0c;用于描述 WXML 的組件樣式。WXSS 具有 CSS 大部分的特性 新增了尺…

js高級—tab欄切換(面向對象做法)

<main><h4>Js 面向對象 動態添加標簽頁</h4><div class"tabsbox" id"tab"><!-- tab 標簽 --><nav class"fisrstnav"><ul><li class"liactive"><span>測試1</span><sp…

MFC的sendmessage和postmessage 以及sendmessagetimeout

PostMessage只負責將消息放到消息隊列中&#xff0c;不確定何時及是否處理&#xff0c;相當于異步操作&#xff0c;執行后馬上返回SendMessage要等到受到消息處理的返回碼&#xff08;DWord類型&#xff09;后才繼續&#xff0c;相當于同步操作&#xff0c;一直在等待&#xff…

python PIL圖像處理-框選

框選圖中位置 代碼 from PIL import Image,ImageDraw,ImageFont,ImageFilter import random#------------------------------------- #filepath,[837,103][942,208]#圖片處理&#xff0c;框選 def pic_rectangle(filepath,bound):image Image.open(filepath)draw ImageDraw.D…

Win10卸載python總是提示error2503失敗各種解決辦法

最近win10的電腦裝了python的3.4&#xff0c;然后想卸載&#xff0c;就總是提示error 2053&#xff0c;類似于這種&#xff1a; 下面是我的坎坷解決之路&#xff1a; 1、網上說&#xff0c;任務管理器 --> 詳細信息 --> explorer.exe結束任務&#xff0c;結束資源管理器&…

js高級—查詢商品案例

<div class"search">按照價格查詢&#xff1a;<input type"text" class"start"> - <input type"text" class"end"><button class"search-price">搜索</button> 按照商品名稱查詢&a…

[Codeforces702F]T-Shirts——非旋轉treap+貪心

題目鏈接&#xff1a; Codeforces702F 題目大意&#xff1a;有$n$種T恤&#xff0c;每種有一個價格$c_{i}$和品質$q_{i}$且每種數量無限。現在有$m$個人&#xff0c;第$i$個人有$v_{i}$元&#xff0c;每人每次會買他能買得起的品質最高的一件T恤(當兩件T恤品質相同時優先買價格…