js類和對象

函數(shù)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript">
                
            /*
             * 創(chuàng)建函數(shù)的方式一:
             *      - 使用函數(shù)聲明來創(chuàng)建一個函數(shù)
             *      - 語法:
             *          function 函數(shù)的名字([形參1,形參2,...形參n]){
             *              語句...
             *          }
             */
            
            //創(chuàng)建一個函數(shù)
            function fun(){
                console.log("語句一");
                console.log("語句二");
                console.log("語句三");
            }
            
        
            //調(diào)用函數(shù)
            fun();
            
            /*
             * 創(chuàng)建函數(shù)的方式二:
             *  - 使用函數(shù)表達(dá)式來創(chuàng)建一個函數(shù)
             *  - 語法:
             *      var 變量 = function([形參1,形參2,...形參n]){
             *          語句...
             *      };
             */
            
            var fun2 = function(){
                alert("我是又一個函數(shù)");
            };
            //調(diào)用函數(shù)
            fun2();
        </script>
    </head>
    <body>
    </body>
</html>

js中函數(shù)可以作為參數(shù)傳遞

第一種寫法

function say (value) {
    alert(value);
}
function execute (someFunction, value) {
    someFunction(value);//回調(diào)函數(shù)
}
execute(say, 'hi js.');

上面代碼是將say方法作為參數(shù)傳遞給execute方法

第二種寫法

        var say = function(value) {
            alert(value);
        }
        function execute (someFunction, value) {
            someFunction(value);//回調(diào)函數(shù)
        }
        execute(say, 'hi js.');

第三種寫法

        function execute (someFunction, value) {
            someFunction(value);//回調(diào)函數(shù)
        }
        execute(function(value) {
            alert(value);
        }, 'hi js.');

上述代碼中execute方法的第一個參數(shù)是一個匿名函數(shù)鹅心。
何謂匿名函數(shù)
沒有函數(shù)名的函數(shù)
1 分析: 函數(shù)為何要有名字? 是為了方便下次使用.
2 用途: 通常不希望再次使用(即只使用一次的)的函數(shù)可以定義為匿名函數(shù).

上面的函數(shù)say被叫做回調(diào)函數(shù)

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

就是你調(diào)用別人(execute),然后別人會調(diào)用你(say),簡言之:你寫一個函數(shù)(say)伞广,但不是由你調(diào)用婶博,是由你調(diào)用的一個函數(shù)(execute)調(diào)用榔昔。

函數(shù)做為返回值

function fn2(a){
    return function (b){
        alert(a+b);            
    };
}

fn2(20)(10);//30

arguments

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript">
            
            /*
             *在調(diào)用函數(shù)時蜈项,瀏覽器還傳遞了另一個隱含的參數(shù)
             *  還有一個參數(shù)叫做arguments
             * 
             * arguments是一個類數(shù)組對象,在它里邊保存著函數(shù)執(zhí)行時的實參
             *  函數(shù)的所有的實參都在arguments中保存,
             *  通過arguments即使不定義形參也可以使用參數(shù)
             * 
             * 
             */
            function fun(a,b,c){
                
            
                //獲取實參的數(shù)量
                //console.log(arguments.length);
                
                //獲取指定的實參
                //實參會保存到arguments對象中指定的位置
                //console.log(arguments[2]);

            }
            
            fun("hello",123,true);
            
        
            
            
        </script>
    </head>
    <body>
    </body>
</html>

變量作用域

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">

        /*
         * 作用域(Scope)
         *  - 作用域簡單來說就是指一個變量的作用的范圍
         *  - 在JS中作用域分成兩種:
         *      1.全局作用域
         *      2.函數(shù)作用域
         *
         *  - 全局作用域:
         *      1.所有直接在script標(biāo)簽中編寫的代碼都在全局作用域中
         *      2.全局作用域在打開網(wǎng)頁時創(chuàng)建晨雳,在網(wǎng)頁關(guān)閉時銷毀
         *      3.全局作用域中有一個全局對象window行瑞,
         *          window代表的是瀏覽器的窗口,
         *          在全局作用域中創(chuàng)建的變量都會作為window對象的屬性保存
         *          在全局作用域中創(chuàng)建的函數(shù)都會作為window對象的方法保存
         *      4.在全局作用域中創(chuàng)建的變量都是全局變量餐禁,可以在頁面的任意位置訪問
         */

        var a = 123;
        b = 456;



        function fun(){
            console.log(b);
            console.log(window.a);
            console.log(window.b);
            console.log("我是全局中的函數(shù)fun血久。。帮非。氧吐。");
        }

        fun();

        //window.fun();

        //window.alert("hello");



    </script>
</head>
<body>
</body>
</html>

變量和函數(shù)的聲明提前:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">


        //如果不寫var绷旗,直接為變量賦值,則相當(dāng)于為window對象添加屬性
        //window.a = 10;
        //a = 10;

        /*
         * 變量的聲明提前
         *  - 使用var關(guān)鍵字聲明的變量副砍,都會在所有的代碼執(zhí)行之前被聲明衔肢,但是不會賦值
         *      賦值會直到執(zhí)行到賦值的代碼時才執(zhí)行
         *  - 如果不適用var關(guān)鍵字聲明變量,則不會有聲明提前的特性
         *
         * 函數(shù)的聲明提前
         *  - 使用函數(shù)聲明創(chuàng)建的函數(shù)豁翎,會在所有的代碼執(zhí)行之前創(chuàng)建角骤,
         *      所以我們可以在函數(shù)聲明前就去調(diào)用函數(shù)
         *  - 使用函數(shù)表達(dá)式創(chuàng)建的函數(shù),沒有這個特性心剥,所以不能在它創(chuàng)建之前調(diào)用
         */
        console.log("a = "+a);

        var a = 10;

        //fun();
        fun2();

        //使用函數(shù)聲明來創(chuàng)建一個函數(shù)
        function fun(){
            console.log("我是fun函數(shù)邦尊。。优烧。蝉揍。");
        }

        //使用函數(shù)表達(dá)式創(chuàng)建一個函數(shù)
        var fun2 = function(){
            console.log("----->我是fun2.。畦娄。又沾。");
        };



    </script>
</head>
<body>
</body>
</html>

函數(shù)作用域

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">

        /*
         * 函數(shù)作用域
         *  - 函數(shù)作用域可以理解為是全局中的小的作用域
         *  - 函數(shù)作用域在函數(shù)調(diào)用時創(chuàng)建睦疫,在調(diào)用結(jié)束時銷毀
         *      每調(diào)用一次函數(shù)就會創(chuàng)建一個新的函數(shù)作用域
         *  - 在函數(shù)作用域中可以訪問到全局變量,
         *      而在全局中無法訪問到函數(shù)作用域中的變量
         *      在函數(shù)中創(chuàng)建的變量如果不寫var耗跛,則會變成全局變量
         *  - 當(dāng)我們在函數(shù)中使用一個變量時,它會先在自身的作用域中尋找剧包,
         *      如果有就直接使用驳癌,如果沒有則去上一級作用域中尋找滑燃,
         *      找到則使用,沒找到則繼續(xù)尋找颓鲜,直到找到全局作用域為止
         *      如果全局作用域中依然沒有表窘,則報錯ReferenceError
         *  - 在函數(shù)作用域中也適用變量和函數(shù)的聲明提前
         *
         */

        //創(chuàng)建一個全局變量a
        var a = "全局中的a";

        function fun(){
            //console.log(a);
            //window.b = ...
            var b = "---> 函數(shù)作用域中的b";

            //console.log(b);
        }

        //fun();

        //console.log(b);

        //創(chuàng)建全局變量c
        var c = "全局c";
        
        console.log(window.c);
        /*function fun2(){

         //創(chuàng)建一個局部變量c
         var c = "---> 函數(shù)中的c";

         console.log(c);

         }



         fun2();*/

        function fun3(){

            //var c = "fun3中的c";

            function fun4(){

                //var c = "fun4中的c";

                console.log(c);
            }

            //調(diào)用fun4
            fun4();

        }

        //fun3();




    </script>
</head>
<body>
</body>
</html>

例子2

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript">
            
            var a = "全局a";
            
            function fun(){
                var a = "--> 函數(shù)a";
                
                //如果在函數(shù)作用域中想訪問全局變量可以通過window對象來訪問
                console.log(window.a);
            }
            
            //fun();
            
            a = 20;
            
            /*
             * 在函數(shù)內(nèi)部使用var關(guān)鍵字聲明的變量也會被聲明提前,
             *  它的聲明會在所有的代碼執(zhí)行前執(zhí)行
             * 
             * 在函數(shù)內(nèi)部使用函數(shù)聲明創(chuàng)建的函數(shù)甜滨,也會在所有的代碼執(zhí)行之前被創(chuàng)建
             */
            function fun2(){
                
                fun3();
                
                //console.log(a);
                
                //var a = 10;
                
                function fun3(){
                    console.log("我是fun2內(nèi)部的函數(shù)乐严。。艳吠。");
                }
                
                
            }
            
            fun2();
            
        </script>
    </head>
    <body>
    </body>
</html>

另一個例子

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">
//        var a = 10;
//
//         function fun(){
//
//         a = 5;
//
//         }
//
//         fun();
//
//         console.log(a);//10  ---函數(shù)作用域在函數(shù)調(diào)用時創(chuàng)建麦备,在調(diào)用結(jié)束時銷毀

        var a = 123;

        /*
         * 定義形參就相當(dāng)于在函數(shù)中聲明了對應(yīng)的變量
         */


        function fun(a) {
         alert(a);
         a = 456;
         }

         fun(); //undefined

         alert(a); //123

        var a = 123;

        function fun(a) {
            alert(a);
            a = 456;
        }

        fun(123); //123

        alert(a); //123
    </script>
</head>

<body>
</body>

</html>

類的定義

//class關(guān)鍵字必須是小寫。   后面就是跟的類名
class PersonClass {
    // 等效于 PersonType 構(gòu)造函數(shù)昭娩。
    constructor(name) {  //這個表示類的構(gòu)造函數(shù)。constuctor也是關(guān)鍵字必須小寫黍匾。
        this.name = name;  //創(chuàng)建屬性栏渺。  也叫當(dāng)前類型的自有屬性。
    } 
   
    sayName() {
        console.log(this.name);
    }
}
var person = new PersonClass("Nicholas");
person.sayName();   // 輸出 "Nicholas"

繼承

class Father{
        constructor(name){
            this.name = name;
        }
        sayName(){
            console.log(this.name);
        }
    }
    class Son extends Father{  //extents后面跟表示要繼承的類型
        constructor(name, age){
            super(name); 
            this.age = age;
        }
        //子類獨(dú)有的方法
        sayAge(){
            console.log(this.age);
        }
    }

    var son1 = new Son("李四", 30);
    son1.sayAge();
    son1.sayName();

子類重寫父類的方法

 class Father{
        constructor(name){
            this.name = name;
        }
        sayName(){
            console.log(this.name);
        }
    }
    class Son extends Father{  //extents后面跟表示要繼承的類型
        constructor(name, age){
            super(name);  //相當(dāng)于以前的:Father.call(this, name);
            this.age = age;
        }
        //子類獨(dú)有的方法
        sayAge(){
            console.log(this.age);
        }
        //子類中的方法會屏蔽到父類中的同名方法锐涯。
        sayName(){
            super.sayName();  //調(diào)用被覆蓋的父類中的方法磕诊。 
            console.log("我是子類的方法,我屏蔽了父類:" + name);
        }
    }

    var son1 = new Son("李四", 30);
    son1.sayAge();
    son1.sayName();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霎终,隨后出現(xiàn)的幾起案子滞磺,更是在濱河造成了極大的恐慌,老刑警劉巖莱褒,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击困,死亡現(xiàn)場離奇詭異,居然都是意外死亡广凸,警方通過查閱死者的電腦和手機(jī)阅茶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谅海,“玉大人脸哀,你說我怎么就攤上這事∨び酰” “怎么了撞蜂?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侥袜。 經(jīng)常有香客問我谅摄,道長,這世上最難降的妖魔是什么系馆? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任送漠,我火速辦了婚禮,結(jié)果婚禮上由蘑,老公的妹妹穿的比我還像新娘闽寡。我一直安慰自己,他們只是感情好尼酿,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布爷狈。 她就那樣靜靜地躺著,像睡著了一般裳擎。 火紅的嫁衣襯著肌膚如雪涎永。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天鹿响,我揣著相機(jī)與錄音羡微,去河邊找鬼。 笑死惶我,一個胖子當(dāng)著我的面吹牛妈倔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绸贡,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盯蝴,長吁一口氣:“原來是場噩夢啊……” “哼毅哗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捧挺,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤虑绵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闽烙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翅睛,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年鸣峭,在試婚紗的時候發(fā)現(xiàn)自己被綠了宏所。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摊溶,死狀恐怖爬骤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莫换,我是刑警寧澤霞玄,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站拉岁,受9級特大地震影響坷剧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喊暖,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一惫企、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陵叽,春花似錦狞尔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胖替,卻和暖如春研儒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背独令。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工端朵, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人记焊。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓逸月,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遍膜。 傳聞我的和親對象是個殘疾皇子碗硬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 函數(shù) js中函數(shù)可以作為參數(shù)傳遞 第一種寫法 上面代碼是將say方法作為參數(shù)傳遞給execute方法 第二種寫法 ...
    __豆約翰__閱讀 620評論 0 2
  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念瓢颅。通過函數(shù)可以封裝任意多條語句恩尾,而且...
    道無虛閱讀 4,564評論 0 5
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,149評論 0 13
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,797評論 0 38
  • 為什么明明體內(nèi)寒涼卻燥熱上火? 若寒邪過盛信柿,身體內(nèi)表現(xiàn)出的就是熱癥冀偶、熱病,也就是說虛火實際上是由寒引起...
    淡淡的云兒閱讀 1,756評論 0 1