国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > JS > 正文

淺談javascript的call()、apply()、bind()的用法

2024-05-06 16:28:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要為大家詳細(xì)介紹了javascript的call()、apply()、bind()的用法,探討JavaScript中函數(shù)的一些特殊用法,感興趣的小伙伴們可以參考一下
 

JavaScript中的函數(shù)不僅是一種類(lèi)似于Java中方法的語(yǔ)言功能,它還可以作為對(duì)象而存在。 本文將要探討JavaScript中函數(shù)的一些特殊用法,包括call、apply、bind三個(gè)原型方法。
一、函數(shù)基礎(chǔ)
JavaScript中的函數(shù)是一種類(lèi)似于Java中方法的語(yǔ)言功能,不過(guò)它可以獨(dú)立于類(lèi)進(jìn)行定義。

函數(shù)式編程:由于JavaScript支持匿名函數(shù),因此可以將函數(shù)作為對(duì)象來(lái)使用, 所以JavaScript不僅支持過(guò)程式編程(面向?qū)ο笠彩沁^(guò)程式編程的一種),還支持函數(shù)式編程。
上下文

函數(shù)的每次調(diào)用都會(huì)擁有一個(gè)特殊值——本次調(diào)用的上下文(context)——這就是this關(guān)鍵字的值。 如果函數(shù)掛載在一個(gè)對(duì)象上,作為對(duì)象的一個(gè)屬性,就稱(chēng)它為對(duì)象的方法。當(dāng)通過(guò)這個(gè)對(duì)象來(lái)調(diào)用函數(shù)時(shí),該對(duì)象就是此次調(diào)用的上下文, 也就是該函數(shù)的this的值。

需要注意,this是一個(gè)關(guān)鍵字,不是變量,也不是屬性名。JavaScript的語(yǔ)法不允許給this賦值。

函數(shù)是一種對(duì)象

JavaScript中的函數(shù)和Java中的方法或C語(yǔ)言中的函數(shù)最大不同在于,JavaScript中的函數(shù)也是一種對(duì)象。 但這并不意味著,所有的對(duì)象都是函數(shù)。函數(shù)是一種包含了可執(zhí)行代碼,并能夠被其他代碼調(diào)用的特殊的對(duì)象。

和變量不同,關(guān)鍵字this沒(méi)有作用域的限制,嵌套的函數(shù)不會(huì)從調(diào)用它的函數(shù)中繼承this。 - 如果嵌套函數(shù)作為方法調(diào)用,其this的值指向調(diào)用它的對(duì)象。 - 如果嵌套函數(shù)作為函數(shù)調(diào)用,其this的值不是全局對(duì)象(非嚴(yán)格模式下)就是undefined(嚴(yán)格模式下)。

很多人誤以為調(diào)用嵌套函數(shù)時(shí)this會(huì)指向掉i用外層函數(shù)的上下文。如果你想訪問(wèn)這個(gè)外部函數(shù)的this值, 需要將this的值保存都在一個(gè)變量中,這個(gè)變量和內(nèi)部函數(shù)都同在一個(gè)作用域內(nèi)。例如:

var o = { m: function() {  var self = this;  console.log(this==o); // true  f();    function f() {   console.log(this === o); // false,this的值是全局對(duì)象或undefined   console.log(self === o); // true  } }}

閉包

JavaScript的函數(shù)可以嵌套在其他函數(shù)中定義,這樣它們就可以訪問(wèn)它們被定義時(shí)所處的作用域中的任何變量。 這意味著JavaScript函數(shù)構(gòu)成了一個(gè)閉包(closure),它給JavaScript帶來(lái)了非常強(qiáng)勁的編程能力。

作為值的函數(shù)
在JavaScript中,函數(shù)不僅是一種語(yǔ)法,也是值,也就是說(shuō),可以將函數(shù)賦值給變量,存儲(chǔ)在對(duì)象的屬性或數(shù)組的元素中, 作為參數(shù)傳入另外一個(gè)函數(shù)等。

bind、call、apply
每一個(gè)函數(shù)都包含一個(gè)prototype屬性,這個(gè)屬性是指向一個(gè)對(duì)象的引用,這個(gè)對(duì)象稱(chēng)作“原型對(duì)象”。 每一個(gè)函數(shù)都包含不同的原型對(duì)象。當(dāng)將函數(shù)用作構(gòu)造函數(shù)的時(shí)候,新創(chuàng)建的對(duì)象會(huì)從原型對(duì)象上繼承屬性。

Function.prototype.call()Function.prototype.apply()

call()和apply()可以看作為某個(gè)對(duì)象的方法,通過(guò)調(diào)用方法的形式來(lái)間接調(diào)用函數(shù)。 它們的第一個(gè)參數(shù)是要調(diào)用函數(shù)的母對(duì)象,它是調(diào)用上下文,在函數(shù)體內(nèi)通過(guò)this來(lái)獲得對(duì)它的引用。 apply()方法和call()方法的作用相同,只不過(guò)函數(shù)傳遞的方式不一樣,它的實(shí)參都放入在一個(gè)數(shù)組中。

舉個(gè)例子,以對(duì)象o的方法的形式調(diào)用函數(shù)f(),并傳入兩個(gè)參數(shù),可以使用這樣的代碼:

var o = {};function f(a, b) { return a + b;}f.call(o, 1, 2);    // 將函數(shù)f作為o的方法,實(shí)際上就是重新設(shè)置函數(shù)f的上下文f.apply(o, [1, 2]);

再舉一個(gè)例子,使用call方法調(diào)用匿名函數(shù):

在下例中的for循環(huán)體內(nèi),我們創(chuàng)建了一個(gè)匿名函數(shù),然后通過(guò)調(diào)用該函數(shù)的call方法,將每個(gè)數(shù)組元素作為指定的this值執(zhí)行了那個(gè)匿名函數(shù)。 這個(gè)匿名函數(shù)的主要目的是給每個(gè)數(shù)組元素對(duì)象添加一個(gè)print方法,這個(gè)print方法可以打印出各元素在數(shù)組中的正確索引號(hào)。 當(dāng)然,這里不是必須得讓數(shù)組元素作為this值傳入那個(gè)匿名函數(shù)(普通參數(shù)就可以),目的是為了演示call的用法。

var animals = [ {species: 'Lion', name: 'King'}, {species: 'Whale', name: 'Fail'}];for (var i = 0; i < animals.length; i++) { (function (i) {   this.print = function () {    console.log('#' + i + ' ' + this.species + ': ' + this.name);   }   this.print(); }).call(animals[i], i);}

Function.prototype.bind()

bind()是在ES5中新增的方法,從名字可以看出,這個(gè)方法的主要作用就是將函數(shù)綁定到某個(gè)對(duì)象。 當(dāng)在函數(shù)f()上調(diào)用bind()方法并后竄入一個(gè)對(duì)象o作為參數(shù),這個(gè)方法將返回一個(gè)新函數(shù): (以函數(shù)調(diào)用的方式)調(diào)用新的函數(shù)將會(huì)把原始的函數(shù)f()作為o的方法來(lái)調(diào)用。例如:

function f(y) { return this.x + y;}var o = { x: 1};var g = f.bind(o); // 通過(guò)調(diào)用 g(x) 來(lái)調(diào)用 o.f(x)g(2); // 3

其實(shí)我們可以輕松的實(shí)現(xiàn)bind()方法:

// 返回一個(gè)函數(shù),通過(guò)調(diào)用它來(lái)調(diào)用o中的方法f(),傳遞它所有的實(shí)參function bind(f, o) { if (f.bind) return f.bind(o); // 如果bind()方法存在,使用bind()方法 else return function () {  return f.apply(o, arguments); }}

二、函數(shù)式編程
JavaScript并非函數(shù)式編程語(yǔ)言,但在JavaScript中可以像操控對(duì)象一樣操控函數(shù),也就是說(shuō)可以在JavaScript中應(yīng)用函數(shù)式編程技術(shù)。

使用函數(shù)處理數(shù)組

假設(shè)有一個(gè)數(shù)組,數(shù)組元素都是數(shù)字,我們想要計(jì)算這些元素的平均值和標(biāo)準(zhǔn)差。

var data = [1, 1, 3, 5, 5];var sum = function(x, y) { return x + y;};var square = function(x) { return x * x;};var mean = data.reduce(sum)/data.length;var deviations = data.map(x => x - mean);

var stddev = Math.sqrt(deviations.map(square).reduce(sum)/(data.length - 1));
高階函數(shù)

高階函數(shù)就是操作函數(shù)的函數(shù),它接收一個(gè)或多個(gè)函數(shù)作為參數(shù),并返回一個(gè)新函數(shù)。舉個(gè)例子:

function not(f) { return function () {  var result = f.apply(this, arguments);  return !result; };}// 判斷x是否為偶數(shù)的函數(shù)var even = function(x) { return x % 2 === 0;};var odd = not(even);      // 一個(gè)新函數(shù),所做的事情和even()相反[1, 1, 3, 5, 5].every(odd);   // true,每個(gè)函數(shù)都是奇數(shù)

函數(shù)not()是個(gè)高階函數(shù),因?yàn)樗祷匾粋€(gè)新的函數(shù),這個(gè)新函數(shù)將它的實(shí)參傳入f(),并返回f的返回值的邏輯非。

以上就是關(guān)于javascript的call()、apply()、bind()的用法,希望對(duì)大家的學(xué)習(xí)有所幫助。



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 营口市| 宕昌县| 虹口区| 鹤岗市| 井研县| 景洪市| 碌曲县| 札达县| 桦甸市| 高州市| 大洼县| 章丘市| 武穴市| 田东县| 中西区| 和政县| 张掖市| 湖口县| 理塘县| 杭锦旗| 济南市| 和龙市| 大邑县| 子长县| 永州市| 阳信县| 霍林郭勒市| 姚安县| 富民县| 宁陕县| 石景山区| 泗阳县| 新龙县| 客服| 卓资县| 河西区| 黄平县| 连平县| 东宁县| 阿鲁科尔沁旗| 江门市|