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

首頁 > 語言 > JavaScript > 正文

Javascript技術難點之apply,call與this之間的銜接

2024-05-06 16:25:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Javascript技術難點之apply,call與this之間的銜接的相關資料,需要的朋友可以參考下
 

1.apply定義

apply:調用函數,并用指定對象替換函數的 this 值,同時用指定數組替換函數的參數。

語法:apply([thisObj[,argArray]])

thisObj

可選。要用作 this 對象的對象。

 argArray 

可選。要傳遞到函數的一組參數。

2.call定義

call:調用一個對象的方法,用另一個對象替換當前對象。

語法:call([thisObj[, arg1[, arg2[, [, argN]]]]])

thisObj

可選。將作為當前對象使用的對象。

 arg1, arg2, , argN

可選。將被傳遞到該方法的參數列表。

3.二者區別

call 的第二個參數可以是任意類型,而apply的第二個參數必須是數組,也可以是arguments。

定義也是有差別的。

4.實例分析

    (1)官方實例:

function callMe(arg1, arg2){  var s = "";  s += "this value: " + this;  s += "<br />";  for (i in callMe.arguments) {    s += "arguments: " + callMe.arguments[i];    s += "<br />";  }  return s;}document.write("Original function: <br/>");document.write(callMe(1, 2));document.write("<br/>");document.write("Function called with apply: <br/>");document.write(callMe.apply(3, [ 4, 5 ]));document.write(callMe.call(3, 4, 5 ));// Output: // Original function: // this value: [object Window] // arguments: 1 // arguments: 2 // Function called with apply: // this value: 3 // arguments: 4 // arguments: 5 

 第一個用apply的:定義:調用函數,并用指定對象替換函數的 this 值 調用函數callMe,使用指定的對象3替換callMe函數中的this,這時候這里的this就從之前的[object Window]變成了3。 第一個用call的:定義:調用一個對象的方法,用另一個對象替換當前對象。 調用對象callMe的方法,用另一個對象3替換callMe中的對象。 從這些結果分析中可以看出,這兩者都是使用指定的對象中的對象或者指定的值改變了對象中的this。 也可以說:是一個函數中的對象(this)"劫持"了另一個要執行函數中的對象(this)。 其實這里引出了一個問題:this到底是啥?為何如此重要的一次次來費勁心思的來改變它的指向? 傳送門:javascript技術難點(三)之this、new、apply和call詳解(這里面說的很棒,絕對夠你喝一壺)     (2)實例:

function zqz(a,b){  return alert(a+b);}function zqz_1(a,b){  zqz.apply(zqz_1,[a,b])}zqz_1(1,2)  //->3 

分析:根據定義:調用函數,并用指定對象替換函數的 this 值,

這里調用函數zqz,并用指定的對象zqz_1替換zqz函數的this值。

要注意js中的函數名其實是對象,因為函數名是對Funtion對象的引用!

function add(a, b){ alert(a + b);}function sub(a, b){ alert(a - b);}add.call(sub, 3, 1); // 4 

分析:根據定義:調用一個對象的方法,用另一個對象替換當前對象。

這里就是調用對象add的方法,并用add對象替換當前對象sub;

再來一個例子:

function zqz(a,b){  this.name=a;  this.age=b;  alert(this.name+" "+this.age);}function zqz_1(a,b){  zqz.apply(this,[a,b])   //我們亦可以這么寫  zqz.apply(this,arguments) }zqz_1("Nic",12)  //Nic 12 

分析:根據定義:調用函數,并用指定對象替換函數的 this 值,

這里調用函數zqz,使用指定的對象this替換函數zqz的this。

再來一個例子:

<input type="text" id="myText"  value="input text">function Obj(){  this.value="對象!";}var value="global 變量";function Fun1(){  alert(this.value);}Fun1();  //global 變量Fun1.call(window); //global 變量Fun1.call(document.getElementById('myText')); //input textFun1.call(new Obj());  //對象!Fun1(); //global 變量 

分析:定義:調用一個對象的方法,用另一個對象替換當前對象。

調用Fun1對象的方法,用window對象替換當前Fun1中的對象。

調用Fun1對象的方法,用input中對象替換當前Fun1中的對象。

調用Fun1對象的方法,用新new出來的obj中的對象替換當前Fun1中的對象。

最后再總結一下:

如果在javascript語言里沒有通過new(包括對象字面量定義)、call和apply改變函數的this指針,函數的this指針都是指向window的。

ps:apply的其他巧妙用法:

大家會不會覺得既然apply和call的用法差不多,那么為什么還同時存在這兩種方法呢?完全可以丟掉一個呀。后來才發現一篇文章中講到apply因為它所傳參數為數組這一特點還有許多其他的妙用。

a) Math.max 可以實現得到數組中最大的一項:

因為Math.max 參數里面不支持Math.max([param1,param2]) 也就是數組,但是它支持Math.max(param1,param2,param3…),所以可以根據apply的特點來解決 var max=Math.max.apply(null,array),這樣輕易的可以得到一個數組中最大的一項。(apply會將一個數組轉換為一個參數接一個參數的傳遞給方法)

這塊在調用的時候第一個參數給了一個null,這個是因為沒有對象去調用這個方法,只需要用這個方法幫助運算,得到返回的結果就行,所以直接傳遞了一個null過去。

b) Math.min  可以實現得到數組中最小的一項:

同樣和 max是一個思想 var min=Math.min.apply(null,array)。

c) 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); 

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

d) 小結:通常在什么情況下,可以使用apply類似Math.min等之類的特殊用法:

一般在目標函數只需要n個參數列表,而不接收一個數組的形式([param1[,param2[,…[,paramN]]]]),可以通過apply的方式巧妙地解決這個問題。



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产日本在线| 成人有码在线视频| 日韩精品中文字幕在线| 欧美一区二区视频97| 亚洲另类欧美自拍| 97avcom| 福利视频一区二区| 亚洲精品不卡在线| 5566成人精品视频免费| 成人黄色在线免费| 亚洲欧美日韩国产精品| 国产深夜精品福利| 成人a视频在线观看| 久久久久久久久久久久av| 国产成人啪精品视频免费网| 欧美一区二区三区艳史| 国产精品第10页| 国产欧美精品在线| 亚洲精品久久久久久久久久久久| 久久久久久久久爱| 日韩在线观看网站| 性亚洲最疯狂xxxx高清| 亚洲欧美一区二区三区久久| 亚洲精品按摩视频| 国产成人精品视| 精品久久久久久久中文字幕| 国产精品男人的天堂| 色偷偷噜噜噜亚洲男人的天堂| 久久99国产精品自在自在app| 国产美女直播视频一区| 欧美极度另类性三渗透| 久久视频在线播放| 最近2019中文字幕一页二页| 亚洲伊人一本大道中文字幕| 欧美美女操人视频| 欧美国产中文字幕| 国产精品影院在线观看| 欧美最猛性xxxx| 国产精品自拍视频| 欧美精品一区在线播放| 97精品伊人久久久大香线蕉| 亚洲人成在线一二| 一色桃子一区二区| 91在线视频免费| 久久精品人人爽| 一本色道久久综合狠狠躁篇怎么玩| 国产精品久久久久91| 色诱女教师一区二区三区| 国产精品流白浆视频| 国产精品美女久久久久av超清| 欧美日韩在线影院| 日韩av大片免费看| 久久这里有精品视频| 成人乱色短篇合集| 国产日韩欧美日韩大片| 中文字幕精品在线视频| 中文字幕亚洲图片| 亚洲精品一区二三区不卡| 日韩精品在线第一页| 国产成人精品久久二区二区| 国产成人精品午夜| 欧美三级免费观看| 亚洲欧洲视频在线| 高清视频欧美一级| 国产精品十八以下禁看| 日韩高清人体午夜| 日韩视频在线一区| 色综合老司机第九色激情| 国产精品福利无圣光在线一区| 91久久久久久久一区二区| 亚洲欧美日韩中文在线| 538国产精品视频一区二区| 国产精品亚洲网站| 一区二区成人av| 亚洲人成网站在线播| 亚洲精品一区二区三区婷婷月| 97精品久久久| 亚洲另类xxxx| 亚洲精品欧美日韩| 国产伦精品一区二区三区精品视频| 欧美性猛交99久久久久99按摩| 中文字幕日韩在线观看| 欧美激情成人在线视频| 国产一区二区三区精品久久久| 国产精品盗摄久久久| 不用播放器成人网| 怡红院精品视频| 亚洲国产女人aaa毛片在线| 超薄丝袜一区二区| 久久精品人人做人人爽| 亚洲女人天堂色在线7777| 欧美床上激情在线观看| 国产精品大片wwwwww| 九九九久久久久久| 国产有码在线一区二区视频| 日韩高清电影好看的电视剧电影| 国产亚洲精品美女久久久| 久久久久久久久久av| 国产精品久久久久久久久久新婚| 亚洲第一网站男人都懂| 亚洲va男人天堂| 国产亚洲精品美女| www.欧美视频| 精品成人69xx.xyz| 欧美精品videofree1080p| 国产综合色香蕉精品| 亚洲激情在线视频| 亚洲一区二区三区乱码aⅴ| 国产精品99免视看9| 国产九九精品视频| 国内精品模特av私拍在线观看| 亚洲国产一区二区三区四区| 亚洲精品国产精品自产a区红杏吧| 久久精品国产v日韩v亚洲| 亚洲欧美国产一本综合首页| www.欧美精品| 亚洲成人在线网| 亚洲精品自拍偷拍| 国产亚洲综合久久| 亚洲色图综合久久| 国产精品无av码在线观看| 久久精品国产99国产精品澳门| 亚洲女人被黑人巨大进入al| 97精品免费视频| 亚洲国产精品成人精品| 亚洲日韩欧美视频| 另类专区欧美制服同性| 欧美日韩亚洲成人| 亚洲高清免费观看高清完整版| 国产三级精品网站| 色噜噜国产精品视频一区二区| 在线观看欧美日韩国产| 精品自拍视频在线观看| 色多多国产成人永久免费网站| 成人黄色免费网站在线观看| 国产精品亚洲精品| 亚洲综合av影视| 亚洲欧美中文日韩在线| 国产一区二区黑人欧美xxxx| 欧美插天视频在线播放| 日韩av电影在线播放| 亚洲一区国产精品| 久久久亚洲国产| 国产一区二区在线免费视频| 亚洲美腿欧美激情另类| 国产主播喷水一区二区| 国产精品偷伦免费视频观看的| 成人写真视频福利网| 久久久久久久国产精品| 日本欧美一二三区| 日韩久久免费视频| 在线看福利67194| 成人午夜两性视频| 日韩免费观看高清| 久久久综合免费视频| 亚洲人a成www在线影院| 日韩成人av网| 中文字幕日韩精品在线观看| 国产精品一区二区久久| 国产精品a久久久久久| 91精品国产综合久久香蕉最新版| 亲爱的老师9免费观看全集电视剧| 国产精品久久久久久久久免费看| 欧美日韩精品中文字幕|