最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中5種調(diào)用函數(shù)的方法

 更新時間:2015年03月12日 11:32:42   投稿:junjie  
這篇文章主要介紹了JavaScript中5種調(diào)用函數(shù)的方法,本文詳細(xì)的介紹了Javascript中各種函數(shù)調(diào)用的方法及其原理,對于理解JavaScript的函數(shù)有很大的幫助,需要的朋友可以參考下

這篇文章詳細(xì)的介紹了Javascript中各種函數(shù)調(diào)用的方法及其原理,對于理解JavaScript的函數(shù)有很大的幫助!

JavaScript,調(diào)用函數(shù)的5種方法

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

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

復(fù)制代碼 代碼如下:

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

最常用的方法,但不幸的,全局的函數(shù)調(diào)用
當(dāng)我們學(xué)習(xí)Javascript時,我們了解到如何用上面示例中的語法來定義函數(shù)。
,我們也知道調(diào)用這個函數(shù)非常的簡單,我們需要做的僅僅是:

復(fù)制代碼 代碼如下:

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' ]

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

JavaScript函數(shù)調(diào)用規(guī)則1
在沒有通過明確所有者對象而直接調(diào)用的函數(shù)中,如myFunction(),將導(dǎo)致this的值成為默認(rèn)對象(瀏覽器中的窗口)。

函數(shù)調(diào)用

讓我們現(xiàn)在創(chuàng)建一個簡單的對象,使用 makeArray函數(shù)作為它的一個方法,我們將使用json的方式來聲明一個對象,我們也來調(diào)用這個方法

復(fù)制代碼 代碼如下:

//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的值變成了對象本身.你可能會疑問原始的函數(shù)定義并沒有改變,為何它不是window了呢.好吧,這就是函數(shù)在JSavacript中傳遞的方式,函數(shù)在JavaScript里是一個標(biāo)準(zhǔn)的數(shù)據(jù)類型,確切的說是一個對象.你可以傳遞它們或者復(fù)制他們.就好像整個函數(shù)連帶參數(shù)列表和函數(shù)體都被復(fù)制,且被分配給了 arrayMaker里的屬性make,那就好像這樣定義一個 arrayMaker:

復(fù)制代碼 代碼如下:

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

JavaScript函數(shù)調(diào)用規(guī)則2

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

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

復(fù)制代碼 代碼如下:

<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>

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

復(fù)制代碼 代碼如下:

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

jQuery是如何重載this的值的呢?繼續(xù)閱讀

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

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

復(fù)制代碼 代碼如下:

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

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

JSavacript函數(shù)調(diào)用規(guī)則3

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

構(gòu)造器

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

復(fù)制代碼 代碼如下:

//聲明一個構(gòu)造器
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' ]

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

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

Javascript函數(shù)調(diào)用規(guī)則4

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

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

相關(guān)文章

  • JavaScript避免嵌套代碼淺析

    JavaScript避免嵌套代碼淺析

    這篇文章主要介紹了JavaScript避免嵌套代碼,很多時候需要編寫的邏輯本身就很惡心, 乍看之下, 堆頁巖般的判定嵌套里似乎每一層都是必要的, 也只能說盡量讓它看起來不那么惡心
    2023-02-02
  • js獲取光標(biāo)位置的最新方法

    js獲取光標(biāo)位置的最新方法

    這篇文章主要給大家介紹了關(guān)于js獲取光標(biāo)位置的最新方法,獲取光標(biāo)位置,最常用的方法就是使用Selection對象和Range對象,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • javascript實現(xiàn)下雪效果【實例代碼】

    javascript實現(xiàn)下雪效果【實例代碼】

    下面小編就為大家?guī)硪黄猨avascript實現(xiàn)下雪效果【實例代碼】。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考
    2016-05-05
  • JavaScript基于inquirer封裝一個控制臺文件選擇器

    JavaScript基于inquirer封裝一個控制臺文件選擇器

    這篇文章主要介紹了JavaScript基于inquirer封裝一個控制臺文件選擇器,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • JavaScript函數(shù)IIFE使用詳解

    JavaScript函數(shù)IIFE使用詳解

    這篇文章主要介紹了JavaScript函數(shù)IIFE使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • js Canvas繪制圓形時鐘效果

    js Canvas繪制圓形時鐘效果

    這篇文章主要為大家詳細(xì)介紹了js Canvas繪制圓形時鐘效果的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 微信小程序?qū)崿F(xiàn)登陸注冊滑塊驗證

    微信小程序?qū)崿F(xiàn)登陸注冊滑塊驗證

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)登陸注冊滑塊驗證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • JS異步的執(zhí)行順序分析

    JS異步的執(zhí)行順序分析

    這篇文章介紹了JS異步的執(zhí)行順序,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 解決LayUI數(shù)據(jù)表格復(fù)選框不居中顯示的問題

    解決LayUI數(shù)據(jù)表格復(fù)選框不居中顯示的問題

    今天小編就為大家分享一篇解決LayUI數(shù)據(jù)表格復(fù)選框不居中顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • Javascript技術(shù)難點(diǎn)之a(chǎn)pply,call與this之間的銜接

    Javascript技術(shù)難點(diǎn)之a(chǎn)pply,call與this之間的銜接

    這篇文章主要介紹了Javascript技術(shù)難點(diǎn)之a(chǎn)pply,call與this之間的銜接的相關(guān)資料,需要的朋友可以參考下
    2015-12-12

最新評論

日土县| 神木县| 阿荣旗| 丰顺县| 东乡县| 望都县| 韶关市| 兴仁县| 辽中县| 龙南县| 仲巴县| 凤阳县| 英山县| 城固县| 那坡县| 绥德县| 大足县| 固安县| 洪洞县| 屯留县| 华阴市| 青海省| 静乐县| 启东市| 沂源县| 广东省| 新余市| 夏邑县| 兰考县| 黎川县| 鄯善县| 关岭| 藁城市| 平谷区| 宁都县| 和顺县| 遵化市| 长岛县| 福海县| 正安县| 樟树市|