摘要:使用模擬實現(xiàn)的方式探究和的原理作用方法就是在使用一個指定值和若干個指定的參數(shù)值的前提下調(diào)用某個函數(shù)或者方法。如果不對進行綁定執(zhí)行會返回也就是說改變了的指向到了。
使用模擬實現(xiàn)的方式探究call 和 apply 的原理 call
作用:
call() 方法就是在使用一個指定 this 值和若干個指定的參數(shù)值的前提下調(diào)用某個函數(shù)或者方法。
var foo = { value : 1 } function bar() { console.log(this.value) } // 如果不對this進行綁定執(zhí)行bar() 會返回undefined bar.call(foo) // 1
也就是說call()改變了 this 的指向到了 foo 。
下面進行一下模擬實現(xiàn)試想當調(diào)用 call 的時候,也就是類似于
var foo = { value: 1, bar: function() { console.log(this.value) } } foo.bar() // 1
這樣就把 this 指向到了 foo 上,但是這樣給 foo 對象加了一個屬性,有些瑕疵,不過不要緊,執(zhí)行完刪除這個屬性就可以完美實現(xiàn)了。
也就是說步驟可以是這樣:
將函數(shù)設(shè)為對象的屬性
執(zhí)行這個函數(shù)
刪除這個函數(shù)
下面就試著去實現(xiàn)一下:
Function.prototype.call2 = function(context) { context.fn = this // this 也就是調(diào)用call的函數(shù) var result = context.fn() delete context.fn() return result } var foo = { value: 1 } function bar() { console.log(this.value) } bar.call2(foo) // 1
但是這樣有一個小缺陷就是call() 不僅能指定this到函數(shù),還能傳入給定參數(shù)執(zhí)行函數(shù)比如:
var foo = { value: 1 } function bar(name, age) { console.log(name) console.log(age) console.log(this.value) } bar.call(foo, "black", "18") // black // 18 // 1
特別要注意的一點是,傳入的參數(shù)的數(shù)量是不確定的,所以我們要使用arguments 對象,取出除去第一個之外的參數(shù),放到一個數(shù)組里:
Function.prototype.call2 = function(context) { context.fn = this // this 也就是調(diào)用call的函數(shù) var args = [...arguments].slice(1) var result = context.fn(...args) delete context.fn() return result } var foo = { value: 1 } function bar(name, age) { console.log(name) console.log(age) console.log(this.value); } bar.call2(foo, "black", "18") // black 18 1
還有一點需要注意的是,如果不傳入?yún)?shù),默認指向為 window,所以最終版代碼:
Function.prototype.call2 = function(context) { var context = context || window context.fn = this // this 也就是調(diào)用call的函數(shù) var args = [...arguments].slice(1) var result = context.fn(...args) delete context.fn() return result } var value = 1 function bar() { console.log(this.value) } bar.call2()apply
apply的方法和 call 方法的實現(xiàn)類似,只不過是如果有參數(shù),以數(shù)組形式進行傳遞,直接上代碼:
Function.prototype.apply2 = function(context) { var context = context || window context.fn = this // this 也就是調(diào)用apply的函數(shù) var result // 判斷是否有第二個參數(shù) if(arguments[1]) { result = context.fn(...arguments[1]) } else { result = context.fn() } delete context.fn() return result } var foo = { value: 1 } function bar(name, age) { console.log(name) console.log(age) console.log(this.value); } bar.apply2(foo, ["black", "18"]) // black 18 1
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/97094.html
摘要:接下來,我們換一種思路,用一個相對較新的來實現(xiàn)方法。從這道題目看出,相比考察死記硬背,這樣的實現(xiàn)更有意義。對數(shù)組的操作我們不能陌生,其中方法更要做到駕輕就熟。最后,我們再看下社區(qū)上著名的和的實現(xiàn)。 有不少剛?cè)胄械耐瑢W跟我說:JavaScript 很多 API 記不清楚怎么辦?數(shù)組的這方法、那方法總是傻傻分不清楚,該如何是好?操作 DOM 的方式今天記,明天忘,真讓人奔潰! 甚至有的開發(fā)...
摘要:接下來,我們換一種思路,用一個相對較新的來實現(xiàn)方法。從這道題目看出,相比考察死記硬背,這樣的實現(xiàn)更有意義。對數(shù)組的操作我們不能陌生,其中方法更要做到駕輕就熟。最后,我們再看下社區(qū)上著名的和的實現(xiàn)。 有不少剛?cè)胄械耐瑢W跟我說:JavaScript 很多 API 記不清楚怎么辦?數(shù)組的這方法、那方法總是傻傻分不清楚,該如何是好?操作 DOM 的方式今天記,明天忘,真讓人奔潰! 甚至有的開發(fā)...
摘要:跨域請求詳解從繁至簡前端掘金什么是為什么要用是的一種使用模式,可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題。異步編程入門道典型的面試題前端掘金在界中,開發(fā)人員的需求量一直居高不下。 jsonp 跨域請求詳解——從繁至簡 - 前端 - 掘金什么是jsonp?為什么要用jsonp?JSONP(JSON with Padding)是JSON的一種使用模式,可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題...
閱讀 3241·2021-11-24 10:43
閱讀 4203·2021-11-24 10:33
閱讀 3781·2021-11-22 09:34
閱讀 2131·2021-10-11 10:58
閱讀 3751·2021-10-11 10:58
閱讀 863·2021-09-27 13:36
閱讀 3583·2019-08-30 15:54
閱讀 2972·2019-08-29 18:41