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

首頁 > 語言 > JavaScript > 正文

Javascript調用函數方法的幾種方式介紹

2024-05-06 16:17:18
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Javascript調用函數方法的幾種方式介紹,本文講解了func()、(function(arg){})(window)、func.bind(sth)()、func.call()、func.apply()等5種方式,需要的朋友可以參考下
 

javascript語法靈活,同一個功能有五六種實現方式并不罕見,然后再加上有些反人類的原型繼承和異步特性,就更讓人一頭霧水了。我經常搞不清楚call,apply之間的區別,今天就記錄一下,以免再忘了。

在javascript中,方法可以通過以下幾種方式執行:

1.func(),這是最直接最常見的調用方式,也符合一般人的思維邏輯,但是在某些情況下有一些不足,下面會解釋。

2.(function(arg){})(window),匿名方法調用,在構造命名空間時比較有用,后面的括號中的參數與匿名方法中的入參一一對應。

3.func.bind(sth)(),mozilla手冊中提到bind是在ECMA-262 5th Edition中新增的一個特性,這里單獨列出來作為一種調用方式是因為它彌補了直接調用中不能綁定作用域的缺陷。

4.func.call(),這是第二種調用方式,每個方法的原型中都定義了call方法,用來執行當前方法。

5.func.apply(),call的雙胞胎兄弟。

func()

這是最常見的調用方式,在任何語言中隨處可見。func(x, y)可以傳入不同的參數。在某些語言,例如php,java中,這種調用足以解決一切問題。但是javascript是一門函數式語言,閉包的概念和一個奇怪的關鍵詞this決定了這種調用方式的不足。this應該可以解釋為當前代碼段的作用域,會隨著代碼執行到不同的片段而改變,但是某些情況下我們不希望這個this被改變,例如綁定在某些dom上的事件,我們肯定不希望他們被調用的時候this被轉移到了window對象上,但有時候確實如此,再比如下面的代碼。

復制代碼代碼如下:

var a ={};
var func = function(x) {
    console.log(this);
};
a.onclick = function() {
    var x = 100;
    func(x);
};
a.onclick();

 

可以把a想象成頁面中的一個鏈接,由于我們只是想將定義好的方法綁定到onclick事件上,而不是立刻調用它,而且這個方法擁有一個參數,所以我們需要用一個匿名方法將他包起來傳遞給a的onclick事件。這樣就有了一個問題,func中的this變成了全局對象window,顯然我們并不希望如此。這個時候,使用func()這種直接調用的方式就不行了,于是我們需要將func外的this綁定到func方法上。于是就有了bind,call,apply方法。

bind

bind的目的非常簡單,返回一個綁定了this對象的相同方法。上面的代碼修改一行就可以實現綁定this在a對象上目的。

復制代碼代碼如下:

var a ={};
var func = function(x) {
    console.log(this);
};
a.onclick = function() {
    var x = 100;
    func.bind(this)(x);  // bind here
};
a.onclick();

 

這樣,onclick事件的this就不會像無頭蒼蠅一樣到處亂跑啦。

call & apply

call和apply要放在一起講,因為他們實在太像了。他們都支持多參數,而且第一個參數都是即將綁定的this對象,第二個參數則是他們的區別所在,call使用獨立的參數作為調用方法的入參,apply使用一個數組作為入參。有的時候我們并不是不想改變this對象,而是想人為的將他綁定到別的對象上,這個時候call和apply是很好用的。(并不是說不能用bind,不過貌似bind出現的比較晚,可能瀏覽器兼容性不好)。舉個栗子:

復制代碼代碼如下:

a = {
    func: function() {
              this.x += 1;
          },
    x: 0
};
b = {
    a: a,
    x: 20
};
for(var i = 0; i < 10; i++){
    b.a.func();
}
console.log(a.x);
console.log(b.x);

 

上面的a和b對象中都有x,我們希望func能針對性的修改對應的x,但是直接調用只可能修改func作用域中的x,也就是a.x。修改一下代碼,就可以實現修改b.x目的

復制代碼代碼如下:

a = {
    func: function() {
              this.x += 1;
          },
    x: 0
};
b = {
    a: a,
    x: 20
};
for(var i = 0; i < 10; i++){
    b.a.func.call(b);  // bind this to b
}
console.log(a.x);
console.log(b.x);

 

這個栗子舉得不好,有點牽強附會,而且這是一種很容易讓人迷惑的代碼風格,有適用的場景,但不是處處都可用。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲二区中文字幕| 亚洲精品日韩久久久| 国产亚洲欧美日韩美女| 中文字幕精品一区久久久久| 久久九九有精品国产23| 欧美激情国产精品| 久久人人爽国产| 米奇精品一区二区三区在线观看| 日韩在线观看精品| 久久精品国产一区二区三区| 日韩中文字幕免费视频| 97精品国产aⅴ7777| 97在线视频免费播放| 国产精品黄页免费高清在线观看| 国产精品久久久久久久久| 国产日韩在线亚洲字幕中文| 亚洲人成免费电影| 亚洲国产高潮在线观看| 成人黄色在线免费| 粉嫩av一区二区三区免费野| 亚洲国产精品专区久久| 性欧美暴力猛交69hd| 欧美电影免费播放| 亚洲韩国欧洲国产日产av| 欧美精品生活片| 精品少妇v888av| 爽爽爽爽爽爽爽成人免费观看| 毛片精品免费在线观看| 成人a视频在线观看| 亚洲精品久久久久久下一站| 欧美激情视频给我| 亚洲欧美日韩精品久久奇米色影视| 大伊人狠狠躁夜夜躁av一区| 国产精品美女999| 中文字幕日韩av综合精品| 久久精品视频中文字幕| 色狠狠av一区二区三区香蕉蜜桃| 久久亚洲欧美日韩精品专区| 久久国产视频网站| 国产精品美女999| 精品久久久久久久中文字幕| 亚洲激情在线观看| 国产精品av在线播放| 青青草原成人在线视频| 国产精品免费一区二区三区都可以| 久久成人在线视频| 久久久久久久色| 亚洲一区二区三区在线视频| 亚洲综合大片69999| 国产精品视频一区二区三区四| 欧美性生交xxxxx久久久| 日韩在线视频一区| 欧美人与性动交a欧美精品| 久久久伊人欧美| 国产精品欧美在线| 国产成人一区二区三区小说| 亚洲aa在线观看| 97视频在线观看视频免费视频| 欧美一区二区视频97| 欧洲成人免费视频| 久久中文字幕国产| 日韩在线播放一区| 精品国产91久久久| 日韩精品久久久久久福利| 精品中文字幕视频| 一个色综合导航| 国产精品一区二区三区毛片淫片| 亚洲成人av片| 日韩av最新在线观看| 日韩高清电影免费观看完整| 国产热re99久久6国产精品| 亚洲自拍在线观看| 国产精品美女午夜av| 亚洲性69xxxbbb| 亚洲成人三级在线| 久久久久亚洲精品| 亚洲国产精品网站| 久久免费观看视频| 日韩精品在线观看网站| 国产精品激情av电影在线观看| 欧美性极品xxxx娇小| 亚洲电影免费观看高清| 亚洲男人天天操| 亚洲美女黄色片| 欧美人与性动交| 免费av一区二区| 色综合久久天天综线观看| 69久久夜色精品国产69| 日韩av免费一区| 亚洲一区二区三区四区在线播放| 欧美中文在线视频| 岛国av一区二区| 2019av中文字幕| 欧美成人午夜影院| 欧亚精品中文字幕| 成人h视频在线| 亚洲韩国青草视频| 欧美激情中文网| 综合国产在线观看| 久久久久久国产免费| 亚洲丁香婷深爱综合| 久久综合伊人77777尤物| 国产精品9999| 日韩免费在线播放| 国产精品美女在线观看| 日韩精品极品毛片系列视频| 国产成人a亚洲精品| 国产精品久久久久久五月尺| 精品久久久久久久久久久久| 亚洲精品成人久久| 中文字幕v亚洲ⅴv天堂| 国语自产精品视频在线看抢先版图片| 久久久久久尹人网香蕉| 久久久久久久久久久亚洲| 国产精品爽爽ⅴa在线观看| 55夜色66夜色国产精品视频| 97免费视频在线| 欧美日韩综合视频| 欧美亚洲成人精品| 久久精品色欧美aⅴ一区二区| 精品亚洲aⅴ在线观看| 97人人做人人爱| 福利二区91精品bt7086| 亚洲国产古装精品网站| 色先锋资源久久综合5566| 欧美日韩在线视频一区| 国产精国产精品| 亚洲国产精品嫩草影院久久| 久久久精品视频成人| 日韩av片永久免费网站| 成人字幕网zmw| 亚洲精品美女在线| 欧美午夜视频一区二区| 国产脚交av在线一区二区| 国产精品久久久久久久久久久久| 国产精品扒开腿做爽爽爽的视频| 91精品视频免费观看| 欧美日韩另类视频| 亚洲天堂男人的天堂| 亚洲激情在线观看| 日韩av免费观影| 欧美视频在线观看 亚洲欧| 91高清在线免费观看| 国产在线观看一区二区三区| 色久欧美在线视频观看| 久久久久久久999精品视频| 久久夜色精品国产亚洲aⅴ| 国产丝袜一区二区三区| 日韩在线观看视频免费| 国产成人av网| 亚洲女在线观看| 中文字幕亚洲天堂| 久久五月天色综合| 欧美激情亚洲视频| 91精品国产高清久久久久久久久| 欧美日韩成人精品| 久久青草精品视频免费观看| 热门国产精品亚洲第一区在线| 亚洲国产成人精品一区二区| 亚洲精品影视在线观看| 国内精品久久久久影院 日本资源| 亚洲国产精品成人av| 色偷偷888欧美精品久久久| 97碰碰碰免费色视频|