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

首頁 > 編程 > JavaScript > 正文

JavaScript中5種調用函數的方法

2019-11-20 12:57:47
字體:
來源:轉載
供稿:網友

這篇文章詳細的介紹了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
九九精品视频在线| 麻豆乱码国产一区二区三区| 亚洲三级 欧美三级| 亚洲精品久久久一区二区三区| 亚洲美女自拍视频| 亚洲成人动漫在线播放| 日韩中文在线中文网三级| 日韩第一页在线| 久久精品99无色码中文字幕| 欧美一区二区视频97| 国产日韩欧美在线| 91在线精品播放| 欧美日韩中文字幕日韩欧美| 夜夜躁日日躁狠狠久久88av| 欧美成人免费va影院高清| 成人福利视频在线观看| 欧美精品免费播放| 国产成人av在线播放| 日韩中文娱乐网| 一本大道香蕉久在线播放29| 欧美一区二区三区精品电影| 亚洲精品一二区| 一区二区日韩精品| 国产欧美一区二区三区在线| 久久久久亚洲精品国产| 久久精品久久久久电影| 国产精品久久久一区| 国产精品九九久久久久久久| 亚洲成人网久久久| 欧美影院成年免费版| 亚洲日本成人网| 日韩有码在线播放| 久久久亚洲网站| 最近的2019中文字幕免费一页| 北条麻妃一区二区三区中文字幕| 黑人巨大精品欧美一区二区| 国产精品com| 国产精品88a∨| 成人久久一区二区| 97色伦亚洲国产| 久久不射电影网| 国产不卡精品视男人的天堂| 日韩精品丝袜在线| y97精品国产97久久久久久| 久久成人免费视频| 日韩亚洲第一页| 色爱精品视频一区| 亚洲免费视频在线观看| 久久全球大尺度高清视频| 成人自拍性视频| 亚洲国产日韩欧美在线99| 国产精品亚洲综合天堂夜夜| 97国产在线观看| 国产a∨精品一区二区三区不卡| 在线日韩第一页| 欧美成人免费大片| 日韩av影院在线观看| 搡老女人一区二区三区视频tv| 97人人做人人爱| 欧美久久久精品| 91网站免费观看| 欧美成人免费小视频| 91麻豆桃色免费看| 欧美午夜xxx| 久久精品视频99| 97超级碰碰碰| 永久555www成人免费| 久久全球大尺度高清视频| 成人午夜在线观看| 中文字幕无线精品亚洲乱码一区| 欧美日韩国产一区二区| 精品久久久久久亚洲国产300| 成人日韩在线电影| 91精品国产综合久久香蕉最新版| 国产91在线播放精品91| 精品中文字幕视频| 欧美日韩福利视频| 在线视频欧美日韩精品| 亚洲免费电影一区| 亚洲va电影大全| 91伊人影院在线播放| 国产美女久久精品香蕉69| 亚洲精品影视在线观看| 亚洲国产精品va在线| 久久精品99无色码中文字幕| 日韩在线视频免费观看| 在线看国产精品| 欧美电影院免费观看| 欧美日韩国产成人高清视频| 中文字幕亚洲在线| 亚洲sss综合天堂久久| 91av在线不卡| 国产一区二区在线播放| 亚洲欧美在线免费| 国产午夜精品全部视频在线播放| 欧美电影在线观看网站| 国产高清视频一区三区| 国产一区二区三区久久精品| 欧美性开放视频| 伊人久久精品视频| 亚洲成人精品在线| 日韩在线激情视频| 亚洲石原莉奈一区二区在线观看| 国产成人午夜视频网址| 国产精品欧美日韩| 久久精品视频中文字幕| 久久影院在线观看| 国产精品电影观看| 欧美激情视频一区| 久久99久久99精品中文字幕| 精品成人国产在线观看男人呻吟| 国产女人18毛片水18精品| 国产69久久精品成人看| 日韩中文字幕在线视频播放| 国产精品嫩草视频| 亚洲女人被黑人巨大进入| 亚洲视频日韩精品| 日韩中文字幕在线播放| 欧美精品情趣视频| 日韩天堂在线视频| 亚洲人成人99网站| 国产成人精品综合久久久| 日韩有码视频在线| 欧美性受xxx| 久久久在线观看| 九九视频直播综合网| 国产亚洲免费的视频看| 亚洲男人av电影| 国产va免费精品高清在线观看| 日韩精品免费在线| 欧美日韩成人网| 热99久久精品| 一级做a爰片久久毛片美女图片| 亚洲视频专区在线| 欧美成人午夜影院| 欧美另类在线观看| 久热精品视频在线免费观看| 国产亚洲欧美aaaa| 久久精品视频播放| 国产精品视频中文字幕91| 精品久久久久久国产91| 日韩电影中文字幕在线| 久久久精品免费| 日韩在线视频网| 国产一区二区三区丝袜| 亚洲精品国产精品久久清纯直播| 欧美精品videossex88| 亚洲免费视频网站| 国产日韩欧美综合| 国产精品一区二区三区在线播放| 91精品国产高清久久久久久| 黑人巨大精品欧美一区二区免费| 成人福利免费观看| 国产精品视频在线观看| 国产精品日韩av| 午夜精品在线视频| 在线精品视频视频中文字幕| 亚洲国产另类久久精品| 国产成人精品免高潮费视频| 国内精久久久久久久久久人| 亚洲最大的网站| 91国语精品自产拍在线观看性色| 清纯唯美亚洲激情| 国产精品久久久久影院日本|