亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 10:32:59
字體:
來源:轉載
供稿:網友

JavaScript中的函數不僅是一種類似于Java中方法的語言功能,它還可以作為對象而存在。 本文將要探討JavaScript中函數的一些特殊用法,包括call、apply、bind三個原型方法。
一、函數基礎
JavaScript中的函數是一種類似于Java中方法的語言功能,不過它可以獨立于類進行定義。

函數式編程:由于JavaScript支持匿名函數,因此可以將函數作為對象來使用, 所以JavaScript不僅支持過程式編程(面向對象也是過程式編程的一種),還支持函數式編程。
上下文

函數的每次調用都會擁有一個特殊值――本次調用的上下文(context)――這就是this關鍵字的值。 如果函數掛載在一個對象上,作為對象的一個屬性,就稱它為對象的方法。當通過這個對象來調用函數時,該對象就是此次調用的上下文, 也就是該函數的this的值。

需要注意,this是一個關鍵字,不是變量,也不是屬性名。JavaScript的語法不允許給this賦值。

函數是一種對象

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

和變量不同,關鍵字this沒有作用域的限制,嵌套的函數不會從調用它的函數中繼承this。 - 如果嵌套函數作為方法調用,其this的值指向調用它的對象。 - 如果嵌套函數作為函數調用,其this的值不是全局對象(非嚴格模式下)就是undefined(嚴格模式下)。

很多人誤以為調用嵌套函數時this會指向掉i用外層函數的上下文。如果你想訪問這個外部函數的this值, 需要將this的值保存都在一個變量中,這個變量和內部函數都同在一個作用域內。例如:

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

閉包

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

作為值的函數
在JavaScript中,函數不僅是一種語法,也是值,也就是說,可以將函數賦值給變量,存儲在對象的屬性或數組的元素中, 作為參數傳入另外一個函數等。

bind、call、apply
每一個函數都包含一個prototype屬性,這個屬性是指向一個對象的引用,這個對象稱作“原型對象”。 每一個函數都包含不同的原型對象。當將函數用作構造函數的時候,新創建的對象會從原型對象上繼承屬性。

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

call()和apply()可以看作為某個對象的方法,通過調用方法的形式來間接調用函數。 它們的第一個參數是要調用函數的母對象,它是調用上下文,在函數體內通過this來獲得對它的引用。 apply()方法和call()方法的作用相同,只不過函數傳遞的方式不一樣,它的實參都放入在一個數組中。

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

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

再舉一個例子,使用call方法調用匿名函數:

在下例中的for循環體內,我們創建了一個匿名函數,然后通過調用該函數的call方法,將每個數組元素作為指定的this值執行了那個匿名函數。 這個匿名函數的主要目的是給每個數組元素對象添加一個print方法,這個print方法可以打印出各元素在數組中的正確索引號。 當然,這里不是必須得讓數組元素作為this值傳入那個匿名函數(普通參數就可以),目的是為了演示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中新增的方法,從名字可以看出,這個方法的主要作用就是將函數綁定到某個對象。 當在函數f()上調用bind()方法并后竄入一個對象o作為參數,這個方法將返回一個新函數: (以函數調用的方式)調用新的函數將會把原始的函數f()作為o的方法來調用。例如:

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

其實我們可以輕松的實現bind()方法:

// 返回一個函數,通過調用它來調用o中的方法f(),傳遞它所有的實參function bind(f, o) { if (f.bind) return f.bind(o); // 如果bind()方法存在,使用bind()方法 else return function () {  return f.apply(o, arguments); }}

二、函數式編程
JavaScript并非函數式編程語言,但在JavaScript中可以像操控對象一樣操控函數,也就是說可以在JavaScript中應用函數式編程技術。

使用函數處理數組

假設有一個數組,數組元素都是數字,我們想要計算這些元素的平均值和標準差。

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));
高階函數

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

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

函數not()是個高階函數,因為它返回一個新的函數,這個新函數將它的實參傳入f(),并返回f的返回值的邏輯非。

以上就是關于javascript的call()、apply()、bind()的用法,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级大片在线观看| 一区二区三区视频观看| 国产一区二区久久精品| 日韩高清av一区二区三区| 精品综合久久久久久97| 97香蕉久久超级碰碰高清版| 伦伦影院午夜日韩欧美限制| 欧美激情a在线| 亚洲精品在线视频| 欧美刺激性大交免费视频| 国产精品久久久91| 91久久国产精品| 欧美精品aaa| 97avcom| 久久精品91久久香蕉加勒比| 国产精品一二三视频| 欧美最猛黑人xxxx黑人猛叫黄| 不卡av电影院| 国产成人一区二区| 久99久在线视频| 日韩成人av在线播放| 欧美乱人伦中文字幕在线| 精品久久久久久久中文字幕| 91黑丝在线观看| 欧美日韩在线免费| 欧美精品videofree1080p| 在线观看久久久久久| 久久99久久99精品中文字幕| 亚洲欧洲中文天堂| 日韩电影大片中文字幕| 狠狠久久亚洲欧美专区| 91精品国产91久久久久久| 日本中文字幕久久看| 欧美精品久久久久久久久| 亚洲综合色av| 欧美性开放视频| 亚洲xxxxx| 激情懂色av一区av二区av| 亚洲精品国产欧美| 国产美女精品视频免费观看| 97欧美精品一区二区三区| 国产精品老女人精品视频| 国产999精品久久久影片官网| 久久久亚洲影院你懂的| 国产一区二区黄| 久久精品99国产精品酒店日本| 久久精品视频一| 日韩av中文字幕在线免费观看| 在线播放日韩欧美| 色婷婷av一区二区三区在线观看| 91久久久久久久久久| 日本sm极度另类视频| 日韩少妇与小伙激情| 欧美性猛交xxxx偷拍洗澡| 国产欧美一区二区三区视频| 国产成人av在线| 狠狠干狠狠久久| 国产精品欧美激情| 一区二区三区国产在线观看| 久久久999国产精品| 一区二区三区回区在观看免费视频| 国产欧美一区二区三区在线看| 欧美日韩福利视频| 日韩一级裸体免费视频| 欧美日韩视频在线| 国内精品一区二区三区| 中文在线不卡视频| 国产中文日韩欧美| 日产精品99久久久久久| 色综合久久精品亚洲国产| 国产精品免费视频久久久| 青草青草久热精品视频在线网站| 国产精品永久免费在线| 欧美成人久久久| 日本91av在线播放| 亚洲精品成a人在线观看| 久久99亚洲精品| 欧美日韩免费网站| 欧美一级电影免费在线观看| 中文字幕亚洲欧美日韩2019| 在线观看国产欧美| 日韩在线观看电影| 国产精品偷伦免费视频观看的| 国产亚洲激情在线| 日韩av第一页| 亚洲护士老师的毛茸茸最新章节| 性欧美暴力猛交69hd| 欧美日韩在线视频观看| 亚洲精品动漫久久久久| 神马久久桃色视频| 久久久欧美精品| 久久久久久久999| 日韩精品中文字幕久久臀| 国产欧美精品xxxx另类| 久久躁日日躁aaaaxxxx| 怡红院精品视频| 九九久久久久久久久激情| 国产一区二区三区在线视频| 国产成人精品久久二区二区| 中文字幕日韩综合av| 欧美日本高清一区| 久久久亚洲网站| 精品国产精品三级精品av网址| 欧美精品18videos性欧| 久久99久国产精品黄毛片入口| 亚洲自拍偷拍第一页| 午夜剧场成人观在线视频免费观看| 日本亚洲欧美三级| 久久69精品久久久久久国产越南| 欧美成人sm免费视频| 国产91对白在线播放| 亚洲色图35p| 国产视频亚洲视频| 2024亚洲男人天堂| 欧美日韩国产色| 欧美国产日本高清在线| 国产精品久久久久久久av电影| 亚洲精品之草原avav久久| 91探花福利精品国产自产在线| 国产精品青青在线观看爽香蕉| 亚洲成年网站在线观看| 亚洲免费精彩视频| 亚洲天堂日韩电影| 国产精品一区二区性色av| 欧美日韩亚洲一区二区| 亚洲性猛交xxxxwww| 91精品国产91久久久久福利| 国产丝袜精品视频| 亚洲欧美日韩国产中文专区| 午夜精品视频在线| 久久精品视频一| 欧美一区二区三区免费视| 亚洲福利视频网站| 欧美性生活大片免费观看网址| 久久亚洲精品视频| 综合网日日天干夜夜久久| 欧美香蕉大胸在线视频观看| 91po在线观看91精品国产性色| 青青草原成人在线视频| 欧美日韩爱爱视频| 欧美亚洲视频一区二区| 国产亚洲福利一区| 国模精品视频一区二区| 亚洲欧美资源在线| 亚洲成人av在线| 欧美高清激情视频| 国产精品久久久久秋霞鲁丝| 色偷偷噜噜噜亚洲男人的天堂| 成人高清视频观看www| 91精品久久久久久久久久久久久久| 北条麻妃一区二区在线观看| 国产精品免费久久久久久| 91黑丝在线观看| 欧美壮男野外gaytube| 欧美成人性色生活仑片| 亚洲欧洲午夜一线一品| 久久天天躁狠狠躁夜夜爽蜜月| 欧美一级黄色网| 久久99视频免费| 欧美另类精品xxxx孕妇| 欧美肥臀大乳一区二区免费视频| 精品美女永久免费视频| 亚洲性视频网址| 97精品久久久中文字幕免费|