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

首頁 > 編程 > JavaScript > 正文

詳解js中的apply與call的用法

2019-11-20 09:22:45
字體:
來源:轉載
供稿:網友

前言

call 和 apply 都是為了改變某個函數運行時的 context 即上下文而存在的,換句話說,就是為了改變函數體內部 this 的指向。
call 和 apply二者的作用完全一樣,只是接受參數的方式不太一樣。

方法定義
apply
Function.apply(obj,args)方法能接收兩個參數:

obj:這個對象將代替Function類里this對象

args:這個是數組或類數組,apply方法把這個集合中的元素作為參數傳遞給被調用的函數。

call

call方法apply方法的第一個參數是一樣的,只不過第二個參數是一個參數列表

在非嚴格模式下當我們第一個參數傳遞為null或undefined時,函數體內的this會指向默認的宿主對象,在瀏覽器中則是window

var test = function(){  console.log(this===window);}test.apply(null);//truetest.call(undefined);//true

用法

"劫持"別人的方法

此時foo中的logName方法將被bar引用 ,this指向了bar

var foo = {  name:"mingming",  logName:function(){    console.log(this.name);  }}var bar={  name:"xiaowang"};foo.logName.call(bar);//xiaowang

實現繼承

function Animal(name){     this.name = name;     this.showName = function(){       console.log(this.name);     }   }   function Cat(name){    Animal.call(this, name);  }   var cat = new Cat("Black Cat");   cat.showName(); //Black Cat

在實際開發中,經常會遇到this指向被不經意改變的場景。
有一個局部的fun方法,fun被作為普通函數調用時,fun內部的this指向了window,但我們往往是想讓它指向該#test節點,見如下代碼:

window.id="window";document.querySelector('#test').onclick = function(){  console.log(this.id);//test  var fun = function(){    console.log(this.id);  }  fun();//window}

使用call,apply我們就可以輕松的解決這種問題了

window.id="window";document.querySelector('#test').onclick = function(){  console.log(this.id);//test  var fun = function(){    console.log(this.id);  }  fun.call(this);//test}

當然你也可以這樣做,不過在ECMAScript 5strict模式下,這種情況下的this已經被規定為不會指向全局對象,而是undefined:

window.id="window";document.querySelector('#test').onclick = function(){  var that = this;  console.log(this.id);//test  var fun = function(){    console.log(that.id);  }  fun();//test}
function func(){  "use strict"  alert ( this );  // 輸出:undefined}func();

其他用法

類數組

這里把符合以下條件的對象稱為類數組

1.具有length屬性

2.按索引方式存儲數據

3.不具有數組的push,pop等方法

常見類數組有 arguments,NodeList!

(function(){  Array.prototype.push.call(arguments,4);  console.log(arguments);//[1, 2, 3, 4]})(1,2,3)

這樣就往arguments中push一個4進去了

Array.prototype.push 頁可以實現兩個數組合并

同樣push方法沒有提供push一個數組,但是它提供了push(param1,param,…paramN) 所以同樣也可以通過apply來裝換一下這個數組,即:

var arr1=new Array("1","2","3"); var arr2=new Array("4","5","6"); Array.prototype.push.apply(arr1,arr2); console.log(arr1);//["1", "2", "3", "4", "5", "6"]

也可以這樣理解,arr1調用了push方法,參數是通過apply將數組裝換為參數列表的集合.

再比如我想求類數組中的最大值

(function(){  var maxNum = Math.max.apply(null,arguments);  console.log(maxNum);//56})(34,2,56);

判斷類型

console.log(Object.prototype.toString.call(123)) //[object Number]console.log(Object.prototype.toString.call('123')) //[object String]console.log(Object.prototype.toString.call(undefined)) //[object Undefined]console.log(Object.prototype.toString.call(true)) //[object Boolean]console.log(Object.prototype.toString.call({})) //[object Object]console.log(Object.prototype.toString.call([])) //[object Array]console.log(Object.prototype.toString.call(function(){})) //[object Function]

以上就是apply與call的用法總結的全部內容,歡迎大家積極留言參加討論,也希望本文對大家學習javascript有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美精品网站| 国产综合久久久久久| 国产成人精品日本亚洲专区61| 亚洲第一偷拍网| 精品欧美aⅴ在线网站| 日韩在线观看免费高清完整版| 欧美激情区在线播放| 国产精品久久久久久久久久久久久久| 色综合久久天天综线观看| 狠狠躁天天躁日日躁欧美| 国产精品白丝av嫩草影院| 亚洲精品久久视频| 91久久在线播放| 日韩中文字幕网| 欧美精品久久久久久久免费观看| 亚洲色图av在线| 国模叶桐国产精品一区| 亚洲女成人图区| 欧美乱人伦中文字幕在线| 伊人久久男人天堂| 国产性猛交xxxx免费看久久| 亚洲国产古装精品网站| 国产一区二区丝袜| 色综合伊人色综合网站| 国产成人97精品免费看片| 最好看的2019的中文字幕视频| 国产精品亚发布| 久久久亚洲天堂| 深夜福利国产精品| 中文字幕在线国产精品| 久久久久久久久国产| 97在线观看视频国产| 国产精品福利网站| 精品毛片网大全| 狠狠综合久久av一区二区小说| 久久精品99国产精品酒店日本| 久热精品视频在线免费观看| 538国产精品一区二区在线| 亚洲精品美女视频| 欧美性感美女h网站在线观看免费| 久久久久久久久久久网站| 日韩av在线免播放器| 欧美片一区二区三区| 日韩免费不卡av| 成人黄色午夜影院| 欧美肥老妇视频| 欧美激情视频一区二区三区不卡| 欧美激情精品久久久久久蜜臀| 日韩小视频在线观看| 在线观看91久久久久久| 亚洲少妇激情视频| 国产精品一区二区在线| 伊人青青综合网站| 欧美性xxxx18| 久久精品国产视频| 日韩成人高清在线| 久久久久久国产精品美女| 综合网日日天干夜夜久久| www日韩欧美| 国产亚洲激情视频在线| 大荫蒂欧美视频另类xxxx| 欧美日韩亚洲一区二| 亚洲欧洲在线视频| 亚洲精品一区二区三区婷婷月| 欧美性xxxxx极品| 精品视频在线导航| 黄色成人在线免费| 91久久综合亚洲鲁鲁五月天| 亚洲精品久久久久久久久久久久| 97国产suv精品一区二区62| 午夜精品久久久99热福利| 午夜精品福利电影| 久久久之久亚州精品露出| 国产美女精彩久久| 欧美激情视频在线观看| 亚洲丝袜在线视频| 亚洲精品电影在线| 亚洲激情视频网| 精品一区二区三区电影| 自拍亚洲一区欧美另类| 91夜夜未满十八勿入爽爽影院| 国产一区二区精品丝袜| 日韩有码在线视频| **欧美日韩vr在线| 国产不卡一区二区在线播放| 久久激情视频久久| 一本色道久久88亚洲综合88| 国产成人精品免费视频| 一区二区成人精品| 亚洲欧美另类中文字幕| 91影视免费在线观看| 久久电影一区二区| 久久久噜噜噜久噜久久| 久久久国产91| 欧美老女人在线视频| 美女福利视频一区| 亚洲美女精品成人在线视频| 69久久夜色精品国产69乱青草| 国产一区视频在线播放| 97国产精品人人爽人人做| 亚洲欧美精品suv| 久久伊人免费视频| 日韩av毛片网| 欧美国产中文字幕| 欧美日韩亚洲精品一区二区三区| 日韩精品中文在线观看| 国产精品美女久久久久av超清| 不卡中文字幕av| 欧美成人中文字幕在线| 国产精品aaaa| 欧美与黑人午夜性猛交久久久| 69久久夜色精品国产69| 欧美一级淫片aaaaaaa视频| 色综合伊人色综合网| 国产精品永久免费在线| 久久久91精品| 日韩视频免费在线| 久热爱精品视频线路一| 欧美亚洲激情视频| 久久成人18免费网站| yellow中文字幕久久| 日本最新高清不卡中文字幕| 26uuu亚洲伊人春色| 亚洲欧美激情精品一区二区| 国产日韩欧美影视| 亚洲欧美一区二区精品久久久| 日韩免费观看网站| 92看片淫黄大片看国产片| 欧美极品在线视频| 日韩精品中文字幕在线播放| 久久久成人的性感天堂| 九九九久久国产免费| 国产精品影院在线观看| 人体精品一二三区| 国内外成人免费激情在线视频网站| 久久久久久久久久亚洲| 国产精品久久久久久久久久99| 久久久亚洲国产天美传媒修理工| 成人免费观看49www在线观看| 久久九九精品99国产精品| 精品国产美女在线| 91精品国产91久久久久| 久久久久这里只有精品| 亚洲人成电影网站色www| 国产精品日日做人人爱| 欧美大片大片在线播放| 亚洲午夜久久久影院| 欧美日韩性生活视频| 国产精品99导航| 欧美激情网友自拍| 国产97免费视| 欧美夫妻性生活xx| 91久久久久久久久| 欧美大码xxxx| 国产午夜精品全部视频在线播放| 中文字幕亚洲专区| 91国内揄拍国内精品对白| 欧美天堂在线观看| 亚洲精品99久久久久中文字幕| 精品国内自产拍在线观看| 亚洲色图国产精品| 亚洲视频第一页| 精品欧美一区二区三区| 91天堂在线观看|