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

首頁 > 語言 > JavaScript > 正文

JavaScript中5種調用函數的方法

2024-05-06 16:16:38
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript中5種調用函數的方法,本文詳細的介紹了Javascript中各種函數調用的方法及其原理,對于理解JavaScript的函數有很大的幫助,需要的朋友可以參考下
 

這篇文章詳細的介紹了Javascript中各種函數調用的方法及其原理,對于理解JavaScript的函數有很大的幫助!

JavaScript,調用函數的5種方法

一次又一次的,我發現,那些有bug的Javascript代碼是由于沒有真正理解Javascript函數是如何工作而導致的(順便說一下,許多那樣的代碼是我寫的).JavaScript擁有函數式編程的特性, 當我們選擇面對它的時候,這將成為我們前進的阻礙.

作為初學者,我們來測試五種函數調用的方法,從表面來看我們會認為那些函數與C#中函數的作用非常相似,但是我們一會兒可以看到還是有非常重要的不同的地方的,忽視這些差異無疑會導致難于跟蹤的bug。首先讓我們創建一個簡單的函數,這個函數將在將在下文中使用,這個函數僅僅返回當前的this的值和兩個提供的參數.

 

復制代碼代碼如下:

<script type="text/javascript">
function makeArray(arg1, arg2){
    return [ this, arg1, arg2 ];
}
</script>

 

最常用的方法,但不幸的,全局的函數調用
當我們學習Javascript時,我們了解到如何用上面示例中的語法來定義函數。
,我們也知道調用這個函數非常的簡單,我們需要做的僅僅是:

復制代碼代碼如下:

makeArray('one', 'two');
// => [ window, 'one', 'two' ]
 
Wait a minute. What's that window
 
 
alert( typeof window.methodThatDoesntExist );
// => undefined
alert( typeof window.makeArray);
// =>
 
 
window.makeArray('one', 'two');
// => [ window, 'one', 'two' ]

 

我說最普遍的調用方法是不幸的是因為它導致我們聲明的函數默認是全局的.我們都知道全局成員不是編程的最佳實踐.這在JavaScript里是特別的正確,在JavaScript中避免使用全局的成員,你是不會為之后悔的.

JavaScript函數調用規則1
在沒有通過明確所有者對象而直接調用的函數中,如myFunction(),將導致this的值成為默認對象(瀏覽器中的窗口)。

函數調用

讓我們現在創建一個簡單的對象,使用 makeArray函數作為它的一個方法,我們將使用json的方式來聲明一個對象,我們也來調用這個方法

復制代碼代碼如下:

//creating the object
var arrayMaker = {
    someProperty: 'some value here',
    make: makeArray
};
 
//invoke the make() method
arrayMaker.make('one', 'two');
// => [ arrayMaker, 'one', 'two' ]
// alternative syntax, using square brackets
arrayMaker['make']('one', 'two');
// => [ arrayMaker, 'one', 'two' ]

 

看到這里的不同了吧,this的值變成了對象本身.你可能會疑問原始的函數定義并沒有改變,為何它不是window了呢.好吧,這就是函數在JSavacript中傳遞的方式,函數在JavaScript里是一個標準的數據類型,確切的說是一個對象.你可以傳遞它們或者復制他們.就好像整個函數連帶參數列表和函數體都被復制,且被分配給了 arrayMaker里的屬性make,那就好像這樣定義一個 arrayMaker:

復制代碼代碼如下:

var arrayMaker = {
    someProperty: 'some value here',
    make: function (arg1, arg2) {
        return [ this, arg1, arg2 ];
    }
};

 

JavaScript函數調用規則2

在一個使用方法調用語法,像 obj.myFunction()或者 obj['myFunction'](),這時this的值為obj

這是事件處理代碼中bug的主要源頭,看看這些例子

復制代碼代碼如下:

<input type="button" value="Button 1" id="btn1"  />
<input type="button" value="Button 2" id="btn2"  />
<input type="button" value="Button 3" id="btn3"  onclick="buttonClicked();"/>
 
<script type="text/javascript">
function buttonClicked(){
    var text = (this === window) ? 'window' : this.id;
    alert( text );
}
var button1 = document.getElementById('btn1');
var button2 = document.getElementById('btn2');
 
button1.onclick = buttonClicked;
button2.onclick = function(){   buttonClicked();   };
</script>

 

點擊第一個按鈕將會顯示”btn”因為它是一個方法調用,this為所屬的對象(按鈕元素) 點擊第二個按鈕將顯示”window”因為 buttonClicked是被直接調用的(不像 obj.buttonClicked().) 這和我們第三個按鈕,將事件處理函數直接放在標簽里是一樣的.所以點擊第三個按鈕的結果是和第二個一樣的.
使用像jQuery的JS庫有這樣的優點,當在jQuery里定義了一個事件處理函數,JS庫會幫助重寫this的值以保證它包含了當前事件源元素的引用,

復制代碼代碼如下:

//使用jQuery
$('#btn1').click( function() {
    alert( this.id ); // jQuery ensures 'this' will be the button
});

jQuery是如何重載this的值的呢?繼續閱讀

 

另外兩個:apply()和call()

你越多的使用JavaScript的函數,你就越多的發現你需要傳遞函數并在不同的上下文里調用他們,就像Qjuery在事件處理函數里所做的一樣,你往往經常需要重置this的值.記住我告訴你的,在Javascript中函數也是對象,函數對象包含一些預定義的方法,其中有兩個便是apply()和call(),我們可以使用它們來對this進行重置.

復制代碼代碼如下:

var gasGuzzler = { year: 2008, model: 'Dodge Bailout' };
makeArray.apply( gasGuzzler, [ 'one', 'two' ] );
// => [ gasGuzzler, 'one' , 'two' ]
makeArray.call( gasGuzzler,  'one', 'two' );
// => [ gasGuzzler, 'one' , 'two' ]

 

這兩個方法是相似的,不同的是后面的參數的不同,Function.apply()是使用一個數組來傳遞給函數的,而Function.call()是將這些參數獨立傳遞的,在實踐中你會發現apply()在大多數情況下更方便.

JSavacript函數調用規則3

如果我們想在不復制函數到一個方法而想重載this的值的時候,我們可以使用 myFunction.apply( obj ) 或 myFunction.call( obj ).

構造器

我不想深入研究在Javascript中類型的定義,但是在此刻我們需要知道在Javascript中沒有類,而且任何一個自定義的類型需要一個初始化函數,使用原型對象(作為初始化函數的一個屬性)定義你的類型也是一個不錯的主義,讓我們來創建一個簡單的類型

復制代碼代碼如下:

//聲明一個構造器
function ArrayMaker(arg1, arg2) {
    this.someProperty = 'whatever';
    this.theArray = [ this, arg1, arg2 ];
}
// 聲明實例化方法
ArrayMaker.prototype = {
    someMethod: function () {
        alert( 'someMethod called');
    },
    getArray: function () {
        return this.theArray;
    }
};
 
var am = new ArrayMaker( 'one', 'two' );
var other = new ArrayMaker( 'first', 'second' );
 
am.getArray();
// => [ am, 'one' , 'two' ]

 

一個非常重要并值得注意的是出現在函數調用前面的new運算符,沒有那個,你的函數就像全局函數一樣,且我們創建的那些屬性都將是創建在全局對象上(window),而你并不想那樣,另一個話題是,因為在你的構造器里沒有返回值,所以如果你忘記使用new運算符,將導致你的一些變量被賦值為 undefined.因為這個原因,構造器函數以大寫字母開頭是一個好的習慣,這可以作為一個提醒,讓你在調用的時候不要忘記前面的new運算符.

帶著這樣的小心,初始化函數里的代碼和你在其他語言里寫的初始化函數是相似的.this的值將是你將創建的對象.

Javascript函數調用規則4

當你將函數用作初始化函數的時候,像MyFunction(),Javascript的運行時將把this的值指定為新建的對象.

我希望理解各種函數調用方式的不同會使你的Sjavacript代碼遠離bugs,有些這樣的bug會確保你總是知道this的值是避免他們第一步。


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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲全黄一级网站| 国产精品视频免费在线| 亚洲xxx自由成熟| www.欧美精品| 97av在线播放| 欧美大片欧美激情性色a∨久久| 成人午夜激情网| 97超级碰碰人国产在线观看| 欧美中文字幕视频| 欧美精品18videos性欧| 久久久999成人| 欧美日韩午夜视频在线观看| 亚洲理论片在线观看| 欧美壮男野外gaytube| 亚洲第一区中文99精品| 国产视频亚洲精品| 亚洲人成电影网站色…| 久久久免费观看视频| 亚洲激情在线观看视频免费| 最新亚洲国产精品| 日韩av在线电影网| 国产精品网站视频| 久久久久久com| 精品久久久香蕉免费精品视频| 岛国av在线不卡| 色青青草原桃花久久综合| 亚洲iv一区二区三区| 国产精品小说在线| 精品在线欧美视频| 亚洲国产一区二区三区在线观看| 91免费精品视频| 亚洲精品网站在线播放gif| 国产精品欧美亚洲777777| 在线免费看av不卡| 久久精品一偷一偷国产| 欧美在线日韩在线| 欧美性xxxxx极品| 亚洲色在线视频| 久久婷婷国产麻豆91天堂| 国内精品久久久久久中文字幕| 国产91热爆ts人妖在线| 福利视频导航一区| 亚洲精选一区二区| 欧美做受高潮电影o| 8050国产精品久久久久久| 国产精品丝袜一区二区三区| 国产精品亚洲综合天堂夜夜| 成人性生交大片免费观看嘿嘿视频| 欧美中文字幕精品| 51色欧美片视频在线观看| 久久久女女女女999久久| 国产欧美一区二区三区久久| 久久香蕉频线观| 亚洲色图17p| 日韩在线观看免费全| 日韩成人av在线播放| 亚洲成人教育av| 亚洲性夜色噜噜噜7777| 91久久夜色精品国产网站| 日本精品一区二区三区在线| 欧美性videos高清精品| 欧美激情精品久久久久久蜜臀| 欧美大肥婆大肥bbbbb| 国产成人avxxxxx在线看| 国产精品丝袜久久久久久高清| 日韩成人中文字幕| 欧美黑人性视频| 精品国产美女在线| 亚洲美女视频网| 日韩在线观看你懂的| 热久久视久久精品18亚洲精品| 最近更新的2019中文字幕| 欧美成人精品一区| 深夜福利一区二区| 成人国产精品免费视频| 亚洲自拍欧美另类| 亚洲免费av片| 97超级碰碰碰久久久| 国产精品午夜视频| 国产精品视频自拍| 欧美亚洲国产日韩2020| 国内外成人免费激情在线视频| 精品国产老师黑色丝袜高跟鞋| 大荫蒂欧美视频另类xxxx| 色多多国产成人永久免费网站| 欧美成人精品一区二区| 欧美黑人xxx| 色中色综合影院手机版在线观看| 亚洲一区二区久久| 欧美做受高潮电影o| 国产一区二区三区在线播放免费观看| 亚洲va欧美va在线观看| 日韩网站免费观看高清| 亚洲视频999| 日韩精品在线观看一区二区| 8090成年在线看片午夜| 91九色国产在线| 欧美丝袜一区二区三区| 成人xxxx视频| 国产精欧美一区二区三区| 久久久免费观看视频| 国产在线观看一区二区三区| 亚洲国产天堂久久国产91| 亚洲伊人久久综合| 欧美激情在线观看| 国产精品三级美女白浆呻吟| 亚洲激情视频在线播放| 亚洲国产精彩中文乱码av在线播放| 亚洲精品视频免费| 亚洲国产精品久久| 自拍偷拍亚洲欧美| 色999日韩欧美国产| 欧美精品videos| 欧美最顶级的aⅴ艳星| 国产香蕉一区二区三区在线视频| 在线播放国产一区中文字幕剧情欧美| 欧美激情国产高清| 国产精品一香蕉国产线看观看| 在线播放国产一区中文字幕剧情欧美| 国产精品免费一区| 国产成人鲁鲁免费视频a| 欧美一级片久久久久久久| 国产一区二区三区直播精品电影| 欧美视频不卡中文| 最新国产成人av网站网址麻豆| 精品国产乱码久久久久久虫虫漫画| 日韩欧美成人网| 亚洲性av在线| 美女福利精品视频| 亚洲成人性视频| 国产91精品久| 亚洲综合中文字幕在线| 国产狼人综合免费视频| 国产精品久久久久久超碰| 久久久视频精品| 日韩精品视频在线观看网址| 精品久久久久久电影| 欧美激情亚洲激情| 57pao成人国产永久免费| 欧美色videos| 日韩av网站在线| 91九色蝌蚪国产| 97国产一区二区精品久久呦| 欧美最猛性xxxx| 伊人久久综合97精品| 欧美激情一区二区三区成人| 欧美另类第一页| 51精品国产黑色丝袜高跟鞋| www亚洲欧美| 欧美性生交大片免网| 亚洲国产成人在线视频| 一区二区在线视频播放| 蜜臀久久99精品久久久久久宅男| 亚洲男女自偷自拍图片另类| 日产精品99久久久久久| 亚洲区中文字幕| 国产高清在线不卡| 国产亚洲精品久久久久久牛牛| 欧美—级高清免费播放| 欧美国产日韩在线| 国产免费成人av| 久久久久久久久久亚洲| 中文字幕精品久久久久| 九九精品在线视频|