實現乙個call

2021-08-29 16:05:46 字數 1115 閱讀 7006

call是js最好用的函式之一,改變函式上下文是外掛程式編寫最經常使用的特性。

var name =

"小鋼炮"

;var cat =

function

say(name)

;say

("ketty");

// 小鋼炮-ketty

say.

call

(cat,

"ketty");

// 貓-ketty

看下面**:

function

say(name)

;var cat =

;cat.fn(

"ketty");

delete cat.fn;

我們把say方法掛載到cat物件上,次數執行say方法的上下文即為cat,執行完之後,過河拆橋的把say方法刪除。

看下面**:

function.prototype.

callx

=function()

;// 動態生成乙個函式名稱

var tempfn =

"callfn"

+new

date()

.gettime()

;// 將函式掛載到執行環境上

context[tempfn]

=this

;// 這裡是為了動態傳參,類似於es6的context[tempfn](...arr);

eval

("context[tempfn]("

+ args +

")")

;delete context[tempfn];}

;say.

callx

(cat,

'ketty');

console.

log(cat)

;

object.freeze

由於依賴修改執行環境,所以當目標物件使用object.freeze時,將無法工作。解決這個問題,並不困難,我們只要將目標物件拷貝乙份即可。

eval

這裡為了動態傳參使用了,呼叫了js引擎,在嚴格模式下是有問題的。

實現乙個Semaphore

其實這是我boss的想法,我一開始聽他這麼說也覺得比較差異,ms已經寫好了何必再自己寫乙個.答案有兩個 1ms寫的東西未必就是最好的,如完成埠,heap等.2semaphore是多執行緒程式設計中的核心元素所以有必要提速.我們都知道在多執行緒中ms提供的多個現成阻塞核心物件中critical mon...

乙個Redis Cache實現

應用中需要通過http呼叫遠端的資料,但是這個獲取過程需要執行較長時間,而且這個資料本身的變化也不頻繁,這種情況最適合用乙個cache來優化。前兩年在做短鏈結實現的時候,曾經用最好的語言php做過乙個redis cache實現 乙個簡單的redis應用 修訂版 但那個畢竟是乙個特定的實現,而且我現在...

實現乙個mvvm

最近在團隊內做了一次vue原理分享,現場手寫了乙個乞丐版mvvm,這裡記錄一下這個mvvm實現的過程。原始碼 這個mvvm是基於發布訂閱模式實現 也是vue本身的實現原理 最終達到的效果如下 使用方式也跟vue一樣 重置 實現很簡單 class mvvm options this.methods m...