1. 程式人生 > >call、apply、bind 的用法

call、apply、bind 的用法

this的動態切換,固然為 JavaScript 創造了巨大的靈活性,但也使得程式設計變得困難和模糊。有時,需要把this固定下來,避免出現意想不到的情況。JavaScript 提供了call、apply、bind這三個方法,來切換/固定this的指向。
1.Function.prototype.call()

func.call(thisValue, arg1, arg2, ...)

call方法,可以指定函式內部this的指向(即函式執行時所在的作用域),然後在所指定的作用域中,呼叫該函式。

1.call()可以接受多個引數,第一引數是this指向的那個物件,當第一個引數的值是undefined或者null時,this指向window;後面的引數時呼叫函式時所需的引數。
2.call方法的一個應用是呼叫物件的原生方法(原型上的方法)。

var obj = {};
obj.hasOwnProperty('toString') // false

// 覆蓋掉繼承的 hasOwnProperty 方法
obj.hasOwnProperty = function () {
  return true;
};
obj.hasOwnProperty('toString') // true

Object.prototype.hasOwnProperty.call(obj, 'toString') // false

上面程式碼中,hasOwnProperty是obj物件繼承的方法,如果這個方法一旦被覆蓋,就不會得到正確結果。call方法可以解決這個問題,它將hasOwnProperty方法的原始定義放到obj物件上執行,這樣無論obj上有沒有同名方法,都不會影響結果。
2.Function.prototype.apply()
apply方法的作用與call方法類似,也是改變this指向,然後再呼叫該函式。唯一的區別就是,它接收一個數組作為函式執行時的引數,陣列的所有成員依次作為引數,傳入原函式。原函式的引數,在call方法中必須一個個新增,但是在apply方法中,必須以陣列形式新增。

func.apply(thisValue, [arg1, arg2, ...])

3.Function.prototype.bind()
由於apply方法(或者call方法)不僅繫結函式執行時所在的物件,還會立即執行函式,因此不得不把繫結語句寫在一個函式體內。

bind方法用於將函式體內的this繫結到某個物件,然後返回一個新函式。
bind方法雖然與call,apply的用法有點不同,但是其作用也是一樣的,也是可以改變函式體內this的指向。
MDN的解釋是:bind()方法會建立一個新函式,稱為繫結函式,當呼叫這個繫結函式時,繫結函式會以建立它時傳入 bind()方法的第一個引數作為 this,傳入 bind() 方法的第二個以及以後的引數加上繫結函式執行時本身的引數按照順序作為原函式的引數來呼叫原函式。

function showColor(){
    console.log("my color is:" + this.color);
}
window.color = "red";
showColor.bind(window); 
showColor.bind(window)();    //my color is:red

apply、call、bind的不同之處。bind方法是建立一個函式,然後可以在需要呼叫的時候再執行函式,並非是立即執行函式;而call,apply是在改變了上下文中的this指向後並立即執行函式。

相關推薦

數組去重,callapplybind之間的區別,this用法總結

步驟 -- 之間 undefined 定義 ply clas turn 需要 一、數組去重,直接寫到Array原型鏈上。 1 //該方法只能去除相同的數字 不會去判斷24和‘24‘是不同的 所有數字和字符串數字是相同是重復的 2 Array.prototype

callapplybind用法

就是 his 指向 一次 cat math int urn bind 數組追加       //用apply拼接 var arr1=[12,‘name:foo‘,2048]; var arr2=[‘Joe‘,‘Hello‘]

閉包,閉包用途,callapplybind用法

聲明 func 相互 function span all this 內存 bsp 什麽是閉包:“函數”和“函數內部能訪問到的變量(也叫環境)”的總和,就是一個閉包。JavaScript有兩種作用域:全局作用域和函數作用域。函數內部可以直接讀取全局變量。但是,在函數外部無法讀

callapplybind方法的用法以及區別

方法呼叫模式: 當一個函式被儲存為物件的一個方法時,如果呼叫表示式包含一個提取屬性的動作,那麼它就是被當做一個方法來呼叫,此時的this被繫結到這個物件。 var a = 1 var obj1 = { a:2, fn:function(){

javascript中call()apply()bind()的用法

javascript中call()、apply()、bind()的用法 其實是一個很簡單的東西,認真看十分鐘就從一臉懵B 到完全 理解! 先看明白下面: 例1 obj.objAge; //17 obj.myFun() //小張年齡undefined 例2 show

JavaScript中的callapplybind用法

這三種都是用來明確指定 this 關鍵字所指物件到底是誰。 Function.prototype.call() call() 方法呼叫一個函式, 其具有一個指定的this值和分別地提供的引數(引數的列表)。 語法 fun.call(thisArg, arg1, arg2, ...

javascript中call()apply()bind()的用法理解

一、bind的用法 第一個:obj.showInfo('arg','arg_18');中傳的2個引數通過showInfo方法改變的是obj下中的name和age 第二個:obj.showInfo.bind(this)('bind','bind_18');中bind要傳的name和age是通過一個一個傳

js中callapplybind用法及區別

call、apply和bind:三者作用一致(都是改變函式的this指向),只是使用的方法不同而已。apply 、 call 、bind 三者都是用來改變函式的this物件的指向的;apply 、 call 、bind 三者第一個引數都是this要指向的物件,也就是想指定的上

javascript中call()apply()bind()的用法終於理解

其實是一個很簡單的東西,認真看十分鐘就從一臉懵B 到完全 理解! 先看明白下面: 例 1 obj.objAge; // 17 obj.myFun() // 小張年齡 undefined 例 2 shows() // 盲僧  比較一下這兩者 this

callapplybind用法

this的動態切換,固然為 JavaScript 創造了巨大的靈活性,但也使得程式設計變得困難和模糊。有時,需要把this固定下來,避免出現意想不到的情況。JavaScript 提供了call、apply、bind這三個方法,來切換/固定this的指向。 1.

callapplybind三者的用法和區別

1. call call、apply、bind都是改變this指向的方法 fn.call 當前例項(函式fn)通過原型鏈的查詢機制,找到function.prototype上的call方法,function call(){[native code]}

js中callapplybind用法

今天看部落格時,看到了這樣的一段js程式碼: var bind = Function.prototype.call.bind(Function.prototype.bind); 我想突然看到這樣的一段程式碼,即使js能力再強的人,可能也需要花點時間去理解。像我這樣的

callapplybind用法以及區別

它們在功能上是沒有區別的,都是改變this的指向,它們的區別主要是在於方法的實現形式和引數傳遞上的不同①call的用法:函式.call(物件, arg1, arg2....)②apply的用法:函式.a

call() apply() bind()方法的作用和區別!

調用 權威指南 () 使用 func 開始 把他 對象 bsp 從一開始,我是在書上看到關於bind()、call() 和 apply(), 不過長久以來,在工作中與網上接觸到了很多關於這三個方法的使用場景,對這三個方法也算是比較熟悉了。所以把他們的作用和區別簡單闡述一下!

JavaScript中的callapplybind是怎麽回事?

ava 利用 參數 lock 們的 app scrip lac target 在JS中,這三者都是用來改變函數的this對象的指向的,他們有什麽樣的區別呢。在說區別之前還是先總結一下三者的相似之處:1、都是用來改變函數的this對象的指向的。2、第一個參數都是this要

JS中的callapplybind方法詳解

面試 glob ble ole 內部 修改 sta illegal 解決 bind 是返回對應函數,便於稍後調用;apply 、call 則是立即調用 。 apply、call 在 javascript 中,call 和 apply 都是為了改變某個函數運行時的上下文(

理解JS中的callapplybind方法

無效 order () 使用 其它 pan 能夠 ner pad 理解JS中的call、apply、bind方法(*****************************************************************) 在Ja

javascript種的callapplybind方法總結

lan bin 並且 技術 指向 bsp div () url  call、apply、bind方法一般用來指定this的環境,在沒有學之前,通常會有這些問題: var a = { user:"追夢子", fn:function(){

JavaScript OOP(二):this關鍵字以及callapplybind

col als == ole 構造 prototype logs rip .com JavaScript的this關鍵字非常靈活! this 返回的總是對象;即返回屬性或方法“當前”所在的對象 1 var o1={ 2 name:‘apple‘, 3

callapplybind不同使用場景

函數 pos mark 就是 指向 bind this mar 使用場景 寫在前面的話 這三個方法都是來自Function.prototype上,所以所有的函數都可以使用。 他們有一個共同點,就是可以指定函數執行時的內部this指向。 call和apply的區別在於參數的