日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows 改变文件大小 函数_手写 bind call apply 方法 与 实现节流防抖函数

發布時間:2024/1/23 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows 改变文件大小 函数_手写 bind call apply 方法 与 实现节流防抖函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實現 bind call apply 方法

this 是什么?

this是指包含它的函數作為方法被調用時所屬的對象。這句話理解起來感覺還是很拗口的,但是如果你把它拆分開來變成這三句話后就好理解一點了。

  • 包含它的函數
  • 作為方法被調用時
  • 所屬的對象
  • 改變 this 指向的函數

    bind、call、apply

    • 共同點
    • 目標函數被調用時,改變 this 的指向為指定的值
    • 三個方法都是函數的方法,掛載在 Funtion.prototype 上
    • 不同點
    • 目標函數調用 call 和 apply 后會直接被執行。
    • 目標函數調用 bind 后,不會立即執行,而是返回一個新的函數,調用新函數才會執行目標函數。

    回顧 call apply bind 的使用

    var btn = document.querySelector(".btn"); var name = "windows"; var obj = {name: "Linux",num: 0,updateNum: function(){this.num++;console.log(this.num) // 1,2,3,4} }function fn(){console.log(this.name); };btn.addEventListener("click", obj.updateNum.bind(obj))fn(); // windows fn.call(obj); // Linux fn.apply(obj) fn(null); // windows

    回顧call與apply的參數使用

    let name = "wanna";let age = 20;let obj = {name: "hurt",objAge: this.age,objFn: function(a, b){console.log(this.name + "年齡" + this.age, "性別:" + a + "興趣愛好" + b);}};let user = {name: "hico",age: 18};obj.objFn.call(user, "男", "籃球"); // hico年齡18 性別:男 興趣愛好籃球obj.objFn.apply(user, ["男","足球"]); // hico年齡18 性別:男 興趣愛好足球obj.objFn.bind(user, "男", "排球")(); // hico年齡18 性別:男 興趣愛好排球obj.objFn.bind(user, ["男", "乒乓球"])(null); // hico年齡18 性別:男 乒乓球 興趣愛好null

    不同的是 bind 必須調用它才會執行

    實現 call

    思路

  • call是可以被所有方法調用的,所以毫無疑問的定義在 Function的原型上
  • 綁定函數被調用時只傳入第二個參數及之后的參數
  • 如果調用者函數,被某一個對象所擁有,那么該函數在調用時,內部的this指向該對象。
  • Function.prototype.MyCall = function(){const ctx = arguments[0] || window;// 被調用的方法定義在 ctx.fn 綁定 thisctx.fn = this;// 獲取實參const arg = [...arguments].slice(1); // 以對象調用的形式調用 fn ,此時的 this 指向 ctx,也就是傳入的需要綁定 this 指向const res = arguments.length > 1 ? ctx.fn(...arg) : ctx.fn();// 刪除方法,防止對傳入的對象造成污染delete ctx.fn;return res; };

    實現 apply

    apply實現的思路與call基本相同,我們只需要對參數進行不同處理即可

    Function.prototype.MyApply = function(){const ctx = arguments[0] || window;// 被調用的方法定義在 ctx.fn 綁定 thisctx.fn = this;// 以對象調用的形式調用 fn ,此時的 this 指向 ctx,也就是傳入的需要綁定 this 指向const res = arguments[1] ? ctx.fn(...arguments[1]) : ctx.fn();// 刪除方法,防止對傳入的對象造成污染delete ctx.fn;return res; };

    實現 bind

    思路

  • call是可以被所有方法調用的,所以毫無疑問的定義在 Function的原型上
  • 綁定函數被調用時只傳入第二個參數及之后的參數
  • 如果調用者函數,被某一個對象所擁有,那么該函數在調用時,內部的this指向該對象。
  • 調用執行,不調用綁定 this 指向
  • Function.prototype.MYBind = function(context){// 深拷貝 防止污染const ctx = JSON.parse(JSON.stringify(context)) || window;// 被調用的方法定義在 ctx.fn 綁定 thisctx.fn = this;// 獲取實參const args = [...arguments].slice(1);// 返回一個綁定函數,等待調用return function () {// 合并實參const allArgs = args.concat([...arguments]);// 以對象調用的形式調用 fn ,此時的 this 指向 ctx,也就是傳入的需要綁定 this 指向return allArgs.length ? ctx.fn(...allArgs) : ctx.fn();}};

    什么是節流?怎么實現節流函數

    我們舉例一個簡單的 demo ,假設我們在頁面用到了滾輪事件

    window.addEventListener("scroll",()=>console.log("1"))

    我現在打算從頁面滾動一次

    于是我們會發現

    輕輕的一滾動執行了 16 次打印,這個函數的默認執行頻率太高了,但是實際上我們并不需要如果高頻的執行,畢竟瀏覽器的性能是有限的,不應該在這里浪費,接下來我們來看看如何優化這種場景。

    如果在限定時間段內,不斷觸發滾動事件。好比我們假設上了一趟公共廁所,發現水龍頭的水大量的噴出,于是我們下意識的擰緊關閉水龍頭,卻擰不緊,即使擰不緊也要節約一下用水,讓水龍頭的水量變小,節約用水,人人有責嘛,好了,廢話不多說,直接上代碼

    let getLog = () => console.log("滾動"); window.addEventListener("scroll", throttle(getLog, 300)); // 節流 function throttle(fn, interval=300){let timer = 0;return function(...arg) {let _this = this;if(timer)return;fn.call(_this, ...arg);timer = setTimeout(function(){timer = 0;},interval);}; };

    也就是讓函數執行一次后,在某個時間段內暫時失效,過了這段時間后再重新激活(類似于技能冷卻)

    開始從頂部滾動,這下狠一點,滾到底部看看效果。

    于是我們發現

    滾到底部居然只打印了11次,坑比我們上面的滾動一次打印 15 次,大大節省了性能的消耗。

    什么是防抖?怎么實現防抖函數

    舉例一個簡單的 demo,現在我打算窗口大小發生改變時打印日志

    let getLog = () => console.log("防抖"); window.addEventListener("scroll",getLog)

    我打算從左邊拉動到右邊

    小小改變窗口大小就發生了這樣的事

    其實實際上我們并不需要如果高頻的執行,畢竟瀏覽器的性能是有限的,不應該在這里浪費,我們來整理一下思路。

    在第一次觸發事件后,不應該立即執行函數,而是給出一個期限值比如 500ms 。

  • 如果 500ms 內沒有再次觸發滾動,那么就執行函數。
  • 如果 500ms 內再次觸發滾動事件,那么當前的計時取消,重新開始計時。
  • 效果:短時間內大量觸發同一事件,只會執行最后一次

    實現:既然前面都提到了計時了,那實現的關鍵就在于 setTimeOut 這個函數了。

    let getLog = () => console.log("防抖");window.addEventListener("resize", debounce(getLog));// fn 要防抖的函數 interval 間隔時間 function debounce(fn, interval=500){let timer = 0;return function(...arg) {let _this = this;clearTimeout(timer);timer = setTimeout(function(){fn.call(_this, ...arg);},interval);} }

    現在我打算窗口從右邊拖到到左邊。

    天吶,控制臺居然只輸出了一次日志,不管我怎么拉動,當我停下來的時候就執行了最后一次

    這下我們明白了。防抖的含義就是讓某個時間期限內,事件處理函數只執行一次,大大節省了性能的消耗。

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的windows 改变文件大小 函数_手写 bind call apply 方法 与 实现节流防抖函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲最大的黄色网 | 性色av无码久久一区二区三区 | 自拍视频国产 | 免费观看黄色的网站 | 欧美在线一卡 | 久久综合91| 日本欧美成人 | 男生插女生视频在线观看 | 日韩精品人妻中文字幕 | 欧美在线视频免费播放 | 一区二区三区在线视频观看 | 91福利视频在线观看 | 91精品国产欧美一区二区成人 | 国产又爽又黄免费软件 | 天堂二区 | 激情草逼| 91在线成人| 亚洲啊v在线 | 亚洲天堂av女优 | 狠狠操夜夜爽 | 特级西西444www高清大胆免费看 | 欧美三日本三级少妇三级99观看视频 | 91精品国产一区二区 | 欧美a∨ | 欧美激情成人在线 | 丁香九月激情 | 成人1区2区3区 | 99riav国产在线观看 | 亚洲尻逼 | 精品影视一区二区 | 蜜臀久久精品久久久用户群体 | 91久久精品一区二区别 | 日韩激情成人 | 亚洲国产高清在线 | 国产xxx| 国产青草 | 天天干免费视频 | 99免费观看视频 | 老熟妻内射精品一区 | 波多野结衣一二三区 | 中文字幕 日韩有码 | 色噜噜狠狠一区二区三区牛牛影视 | 成人av免费在线观看 | 国产三级一区 | 免费成人蒂法网站 | 九九视频精品在线 | 女人高潮娇喘1分47秒 | 国产网站黄色 | 激情专区 | jizz中国少妇高潮出水 | 免费在线色 | 私密视频在线观看 | www.一区 | 国产乱国产乱老熟300部视频 | 欧美性受xxxx | 麻豆免费在线视频 | 一本色道av | 日韩av一区二区在线播放 | 肉大榛一进一出免费视频 | 波多野结衣一二三区 | 曰韩一级片| 青青草国产一区二区三区 | 蜜桃视频在线观看一区 | 日韩一区网站 | 国模大胆一区二区三区 | 国产精品免费av一区二区三区 | 麻豆影视大全 | 欧美交换配乱吟粗大25p | 国产精品国产三级国产aⅴ浪潮 | 成人毛片大全 | 国产精品色| 99国产精品一区二区 | 另类亚洲激情 | 欧美性猛交久久久乱大交小说 | 综合久久中文字幕 | 国产黄在线免费观看 | 超碰人人在线观看 | 成人在线手机视频 | 日本成人网址 | 精品福利一区二区三区 | 黄色av在| 欧美做受69| 又黄又爽的视频在线观看 | 中国性老太hd大全69 | 亚洲av无码精品色午夜 | 国产区一区二 | 毛茸茸free性熟hd | 国产精品国产三级国产传播 | 欧美春色| 中文字幕在线字幕中文 | 无码一区二区三区免费视频 | 香蕉网站在线 | 成人在线视频一区二区三区 | 欧美日韩不卡一区二区三区 | 国产伦精品一区二区三区视频1 | 欧美久久久久久又粗又大 | 国产精彩视频一区 | 成人在线观 | 国产三级伦理片 |