<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        5種JavaScript調用函數的方法

        來源:懂視網 責編:小采 時間:2020-11-27 20:30:51
        文檔

        5種JavaScript調用函數的方法

        5種JavaScript調用函數的方法:一次又一次的,我發現,那些有bug的Javascript代碼是由于沒有真正理解Javascript函數是如何工作而導致的(順便說一下,許多那樣的代碼是我寫的).JavaScript擁有函數式編程的特性, 當我們選擇面對它的時候,這將成為我們前進的阻礙. 作為初學者,我們來測試五種函
        推薦度:
        導讀5種JavaScript調用函數的方法:一次又一次的,我發現,那些有bug的Javascript代碼是由于沒有真正理解Javascript函數是如何工作而導致的(順便說一下,許多那樣的代碼是我寫的).JavaScript擁有函數式編程的特性, 當我們選擇面對它的時候,這將成為我們前進的阻礙. 作為初學者,我們來測試五種函

        一次又一次的,我發現,那些有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的主要源頭,看看這些例子www.2cto.com

        <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的值是避免他們第一步。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        5種JavaScript調用函數的方法

        5種JavaScript調用函數的方法:一次又一次的,我發現,那些有bug的Javascript代碼是由于沒有真正理解Javascript函數是如何工作而導致的(順便說一下,許多那樣的代碼是我寫的).JavaScript擁有函數式編程的特性, 當我們選擇面對它的時候,這將成為我們前進的阻礙. 作為初學者,我們來測試五種函
        推薦度:
        標簽: 方法 使用 種方法
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产熟亚洲女视频| 亚洲AV无码成人精品区蜜桃 | 免费A级毛片无码久久版| 久久精品国产精品亚洲| 老外毛片免费视频播放| 99爱免费观看视频在线| 国产成人免费一区二区三区| 中文字幕亚洲精品| 国产日韩精品无码区免费专区国产| **毛片免费观看久久精品| 久久久久国产成人精品亚洲午夜| 一级毛片人与动免费观看| 亚洲真人无码永久在线| 好紧我太爽了视频免费国产 | 两个人的视频高清在线观看免费| 国产aⅴ无码专区亚洲av麻豆 | 日本一区免费电影| 曰批全过程免费视频免费看| 久久久久久久免费视频| 亚洲精品一二三区| 四虎永久免费地址在线观看| 伊人久久大香线蕉免费视频| 亚洲国产综合精品中文第一区| 18级成人毛片免费观看| 亚洲狠狠婷婷综合久久| 亚洲人成网站观看在线播放| 成人亚洲国产精品久久| 国产aⅴ无码专区亚洲av麻豆| 久久免费观看国产精品88av| 亚洲色在线无码国产精品不卡 | 在线观看免费毛片| 乱淫片免费影院观看| 日韩精品视频免费网址| 亚欧国产一级在线免费| 亚洲视频一区网站| 四虎免费永久在线播放| 91av在线免费视频| 亚洲大香人伊一本线| 国产免费一区二区三区| 免费福利资源站在线视频| 亚洲综合亚洲国产尤物|