摘要:和類似,都是調用函數,并指定函數的值和參數,區別在于傳入參數是通過參數列表的形式,傳入參數是通過數組的形式方法與前兩個不同,它創建一個新的函數,在調用新函數時,會調用原函數,并指定原函數的值和參數。執行的時候并沒有調用函數。
簡介
JavaScript 中有三個方法Function.prototype.call()、Function.prototype.apply()和Function.prototype.bind()可以用來指定函數 this 值。call() 和 apply() 類似,都是調用函數,并指定函數的 this 值thisArg和參數,區別在于call()傳入參數是通過參數列表的形式arg1, arg2, ...,apply()傳入參數是通過數組的形式[arg1, arg2, ...]:
function.call(thisArg, arg1, arg2, ...) function.apply(thisArg, [arg1, arg2, ...])
bind()方法與前兩個不同,它創建一個新的函數,在調用新函數時,會調用原函數,并指定原函數的 this 值和參數。bind() 執行的時候并沒有調用函數。bind()傳入參數的方式和call()一樣,都是用參數列表:
fucntion.bind(thisArg, arg1, arg2, ...)用法 call()
使用call()調用父類構造函數來實現繼承,也可以用apply(),只不過傳參方式略有區別:
// 使用 call 實現繼承 var Pet = function (name, age) { this.name = name this.age = age } var Cat = function (name, age, color) { Pet.call(this, name, age) this.color = color } var cat = new Cat("Garfield", 1, "orange") console.log(cat.name) // Garfield console.log(cat.age) // 1 console.log(cat.color) // orange // 使用 apply 實現繼承: var Dog = function (name, age, size) { Pet.apply(this, [name, age]) this.size = size }
當調用一個對象的方法時,方法中 this 指向的是對象本身,用call()改變方法的 this 值:
var utils = { setName: function (name) { this.name = name } } // 使用 call 指定 setName 中的 this 指向自己 var Person = function (name) { utils.setName.call(this, name) } var p = new Person("John") console.log(p.name) // "John"apply()
apply()方法除了用來指定函數 this 值,還可以用來傳遞參數。例如,Math.max()允許傳入多個參數,求它們的最大值,可以用apply()方法將數組元素作為參數傳遞給Math.max()方法:
// 使用循環求最大值 var numbers = [1, 0, 0, 8, 6], max = -Infinity for (var i = 0; i < numbers.length; i++) { max = Math.max(numbers[i], max) } // 使用 apply 求最大值,代碼更簡潔 var numbers = [1, 0, 0, 8, 6] max = Math.max.apply(null, numbers) // 使用 apply 給數組添加元素 var numbers = [1, 0, 0, 8, 6], arr = [] arr.push.apply(arr, numbers)
另外,因為 JS 引擎有參數長度的限制,如果參數數組太長,可能會造成程序異常。所以,對于超長參數數組,應切分成更小的尺寸,分多次調用該方法。
bind()在給setTimeout和setInterval傳入函數時,函數中 this 指向的是全局 window 對象。使用bind()方法,重新指定 this 值:
var Person = function (name) { this.name = name } Person.prototype.say = function () { setTimeout(function () { console.log("My name is " + this.name) }.bind(this)) } var p = new Person("John") p.say() // My name is John
在給 Dom 對象添加監聽函數時,監聽函數作為 Dom 對象的一個方法,函數中 this 指向的是 Dom 對象。使用bind()方法,重新指定 this 值,使用箭頭函數也可以達到同樣的效果:
var fakeDom = { a: "fakeDom" } var addEvent = function () { this.a = "addEvent" fakeDom.onClick = function () { console.log(this.a) } fakeDom.onClickBind = function () { console.log(this.a) }.bind(this) fakeDom.onClickArrow = () => { console.log(this.a) } } addEvent() fakeDom.onClick() // "fakeDom" fakeDom.onClickBind() // "addEvent" fakeDom.onClickArrow() // "addEvent"
使用bind()綁定參數后,新函數只需要傳入剩余參數:
var add = function (a, b) { return a + b } var add5 = add.bind(null, 5) console.log(add5(3)) // 8
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102689.html
摘要:什么是函數的作用域函數作用域在中,作用域為可訪問變量,對象,函數的集合。函數作用域作用域在函數內修改。與函數又有什么關系呢對象是在運行時基于函數的執行環境綁定的。 什么是函數的作用域 函數作用域:在 JavaScript 中,作用域為可訪問變量,對象,函數的集合。JavaScript 函數作用域: 作用域在函數內修改。 this 與函數又有什么關系呢? this對象是在運行時基于函數的...
摘要:其實它們都很簡單,但是在處理一些與相關的函數的時候,用來改變函數中的指向,卻是必不可少的工具,所以必須掌握好它們的用法。 關于javascript中的bind、call、apply等函數的用法 我GitHub上的菜鳥倉庫地址: 點擊跳轉查看其他相關文章 文章在我的博客上的地址: 點擊跳轉 ? ? ? ? 前面的文章已經說到this的指向了,那么這篇文章就要說一說和this相關的三個...
摘要:理解文章中已經比較全面的分析了在中的指向問題,用一句話來總結就是的指向一定是在執行時決定的,指向被調用函數的對象。與和直接執行原函數不同的是,返回的是一個新函數。這個新函數包裹了原函數,并且綁定了的指向為傳入的。 理解 JavaScript this 文章中已經比較全面的分析了 this 在 JavaScript 中的指向問題,用一句話來總結就是:this 的指向一定是在執行時決定的,...
摘要:新手經常犯的一個錯誤是將一個方法從對象中拿出來,然后再調用,希望方法中的是原來的對象。如果不做特殊處理的話,一般會丟失原來的對象。 call、apply、bind是JavaScript中Function函數自帶的方法,主要用于改變this的指向 區別: call() 1.語法: fun.call(this, arg1,arg2) 2.this取值的幾點說明: (1)處于非嚴格模式下,...
摘要:綁定函數被調用時,也接受預設的參數提供給原函數。一個綁定函數也能使用操作符創建對象這種行為就像把原函數當成構造器。 一直很難理解js中的call apply bind,在w3schools,mdn閱讀了,也看了很多相關的文章,今天我來寫下我理解的call apply bind 首先創建一個函數 function man(){} man.prototype = { name: ...
閱讀 2573·2021-09-30 09:48
閱讀 2564·2019-08-30 14:10
閱讀 2707·2019-08-29 11:22
閱讀 1837·2019-08-26 13:51
閱讀 2275·2019-08-26 12:02
閱讀 2415·2019-08-23 16:06
閱讀 3548·2019-08-23 14:06
閱讀 1092·2019-08-23 13:56