JavaScript - 嚴格模式 - 作用域


今天先從一個小案例說起,面向對象的內容已經過去一半,剩下的內容也至關重要 ! 希望幫到你的朋友, 能持續(xù)關注更新 !

需求 : 圖書管理操作

  • 示例代碼 :
var list = [
        {name:"專業(yè)主義",author:"大前研一"},
        {name:"紅樓夢",author:"曹公子"},
        {name:"什么是批判",author:"阜纾柯"},
        {name:"十萬個為什么钩乍?",author:"作者不詳"}
    ];
    //01 提供構造函數(shù)
    function BookListManager(){
        this.bookList = null;
    }

    //02 設置原型對象
    BookListManager.prototype = {
        init:function(arrayList){
            this.bookList = arrayList || [];
        },
        getBookByName:function (name) {
        //01 能夠找到該對象,返回
        for (var i = 0; i < this.bookList.length; i++)
        {
            var obj = this.bookList[i];
            if (obj.name == name)
            {
                return obj;
            }
        }

        //02 找不到這個對象谬盐,返回null
        return null;
    },
        addBook:function (bookObj){
        this.bookList.push(bookObj);
    },
        updateBook:function (name,author){
        var book = this.getBookByName(name);   //在原型方法中要調用其它的原型方法需要使用this
        book.author = author;
    },
        removeBook:function (name){
        var book = this.getBookByName(name);
        var index = this.bookList.indexOf(book); //返回指定對象的索引氯材,如果沒有那么就返回-1
        if(index == -1)
        {
            throw "要刪除的數(shù)據不存在渣锦!";
        }
        //刪除對象
        this.bookList.splice(index,1);
    }
    }

    //03 創(chuàng)建對象
    var p1 = new BookListManager();
    var p2 = new BookListManager();

    console.log(p1);
    console.log(p2);
    p1.init([{name:"城堡",author:"卡夫卡"}]);
    p2.init([{name:"一分鐘學會H5開發(fā)",author:"烏拉烏拉"}]);

    console.log(p1);
    console.log(p2);
</script>
  • 總結 : 這個小Demo就是面向對象編程的示例,自習看代碼的話會不會覺得封裝性很好,以后可以直接拿到項目中應用,而且不用擔心和別的同事的代碼發(fā)生沖突.這就是面向對象編程的好處,代碼看起來逼格也很高

嚴格模式

說明

  • 在js開發(fā)中可以選擇嚴格模式或者是非嚴格模式來進行開發(fā),默認是非嚴格模式的
  • 區(qū)別:在嚴格模式下氢哮,會做更嚴格的檢查袋毙,一以前在非嚴格模式下不會報錯或者是可以使用的一些語句在嚴格模式下使用會報錯或者是拋出異常。
  • 嚴格模式它本身做了向后兼容:如果是支持嚴格模式的引擎冗尤,在檢測到這個字符串的時候娄猫,就會在作用域中開啟嚴格模式,如果是不支持嚴格模式的引擎生闲,那么就直接忽略處理
  • 建議:推薦以后全部使用嚴格模式。
  • 語法 : "use strict" 在提供字符串設置嚴格模式的時候月幌,必須要把字符串寫在當前作用域的最頂端

** "use strict" 注意點 :
1.在書寫字符串的使用雙引號和單引號都可以
2.字符串后面的分號可以省略
3.所有的字符必須全部小寫
4.這個字符串只能擁有10個字符**

使用注意點

  • 所有的變量都必須要使用var聲明
  • 不能使用delete關鍵字來刪除全局變量
  • 函數(shù)的形參列表中不能出現(xiàn)同名的參數(shù)
  • 在對象內部不能出現(xiàn)相同的屬性
  • 禁止使用八進制
  • 禁止使用with語句
  • 禁止使用eval 和arguments作為標識符( 標識符就是不要這讓兩個參數(shù)作為變量使用 不然會報錯 !)
  • 在函數(shù)調用的時候碍讯,修正了函數(shù)內部this的指向
  • 示例代碼 :
<script>
  "use strict";
   var obj1 = {
        name:"張三",
        showName:function(){
            console.log(this);
        }
    }

    obj1.showName();   //obj1            this--->obj1
    var showName = obj1.showName;
    showName();         //this丟失的問題  this--->window(非嚴格)|undefined(嚴格)

    obj1.showName.call(null);  
    //在嚴格模式下,函數(shù)內部的this綁定誰由第一個參數(shù)決定扯躺,如果沒有傳遞那么是undefined捉兴,如果傳入的值是null蝎困,那么綁定的就是null
</script>
  • 禁止使用callee | caller
  • arguments在函數(shù)內部的表現(xiàn)和非嚴格模式不同

1.arguments 接收實參的值
2.值類型&&引用類型的數(shù)據作為函數(shù)的參數(shù)傳遞,在非嚴格模式下倍啥,arguments和形參共享一份數(shù)據
3.重新設置了形參的值禾乘,arguments的值也會發(fā)生改變,在嚴格模式下虽缕,arguments和形參是獨立的始藕,他們之間沒有關系,修改了形參的值對arguments沒有影響的

  • 示例代碼 :
<script>
  "use strict";
    function funcName(paramStr){
        console.log(paramStr);
        console.log(arguments[0]);

        //重新設置形參的值
        paramStr = "測試的字符串";
        console.log(arguments[0]);
    }
    var str = "demoStr";
    funcName(str);

    function funcName02(obj)
    {
        console.log(obj);
        console.log(arguments[0]);

        //重新設置obj的值
        obj = {age:20};
        console.log(obj);
        console.log(arguments[0]);
    }
    var obj = {
        name:"張三"
    };

    funcName02(obj);
</script>

嚴格模式的作用域

寫在當前作用域的最頂端
作用范圍
  • script標簽 只對當前的標簽有影響氮趋,僅僅設置當前的標簽為嚴格模式
  • 函數(shù)內 那么只對當前的函數(shù)作用域有效
  • 示例代碼 :
<script>
     // "use strict";     位置01 對f1和f2都有效
    function f1(){
     // "use strict";     位置02 對f1有效f2無效

        //a = 10;
    }
    function f2(){
    // "use strict"; 位置03  對f2有效f1無效
        b = 20;
    }
    f1();
    f2();
</script>

作用域

某個變量有( 起 ) 作用的范圍
塊級作用域, 在別的語言里有塊級作用域, 但是在js中沒有塊級作用域
js中的作用域
  • script構成了全局作用域
  • 在js中函數(shù)是唯一一個可以創(chuàng)建作用域的對象
詞法作用域 - 動態(tài)作用域
  • 詞法作用域:在變量聲明的時候伍派,它的作用域就已經確定了
  • 動態(tài)作用域:在程序運行的時候,由程序的當前上下文(執(zhí)行環(huán)境)決定的
  • js屬于詞法作用域
詞法作用域的訪問規(guī)則:
  • 先在當前作用域中查找剩胁,如果找到就直接使用,如果沒有找到诉植,那么就到上一級作用域中查找,如果還沒有找到那么就重復這個查找的過程昵观,直到全局作用域

變量和函數(shù)提升

js的執(zhí)行順序
  • 預解析階段 變量和函數(shù)的提升(聲明)
  • 具體的執(zhí)行階段
  • 變量和函數(shù)的提升
  • 示例代碼 :
<script>
    console.log(a);   //undefined ?
    var a = 10;

    f1();
    function f1(){
        console.log("f1");
    }
</script>
  • 變量和變量同名的情況:后面的變量會把前面的變量覆蓋
  • 示例代碼 :
<script>
//    var n1 = "n1";
//    console.log(n1);                //n1
//
//    function test(){
//        console.log(n1);
//    }
//
//    test();                         //n1
//    var n1 = "new n1";
//    console.log(n1);                //new n1
//    test();                         //new n1


//      模擬變量和函數(shù)的提升
        var n1;
        function test(){
            console.log(n1);
        }
        var n1;
    n1 = "n1";
    console.log(n1);                //n1

    test();                         //n1
    n1= "new n1";
    console.log(n1);                //new n1
    test();                         //new n1
</script>
  • 函數(shù)和函數(shù)同名的情況
  • 示例代碼 :
<script>
    f1();                   //10 ? 20
    function f1(){
        console.log(10);
    }

    f1();                   //20
    function f1(){
        console.log(20);
    }
    f1();                   //20
</script>
  • 函數(shù)和變量同名的情況:可以理解為函數(shù)聲明提升而變量的聲明不提升(忽略)
  • 示例代碼 :
<script>
    console.log(demo);                      //
    var demo = "我是字符串";
    function demo(){
        console.log("我是函數(shù)");
    }

    console.log(demo);                      //

    //......
    var demo;
    function demo(){
        console.log("我是函數(shù)");
    }

    console.log(demo);                      //函數(shù)
    demo = "我是字符串";
    console.log(demo);                      //我是字符串


</script>
<script>
    console.log(test);                      //函數(shù)
    function test(){
        console.log("我是函數(shù)");
    }
    var test = "我是帥哥";
    console.log(test);                      //

    ///////變量聲明(和函數(shù)同名的)不會提升
    function test(){
        console.log("我是函數(shù)");
    }
    console.log(test);                      //
    var test = "我是帥哥";
    console.log(test);
</script>
注意 : 如果是函數(shù)的表達式,那么在做函數(shù)聲明提升的時候,僅僅只會把var 變量的名稱(函數(shù))提升到當前作用域的最頂端

作用域鏈

  • js中函數(shù)可以創(chuàng)建作用域
  • js中的函數(shù)中可以聲明函數(shù)
  • 函數(shù)內部的函數(shù)中又可以聲明函數(shù)
  • 以上,會形成一個鏈式的結構,這個是作用域鏈
  • 示例代碼 :
<script>

    var a = 10;
    function f1(){

        function f2(){

            var d = "demoD";
        }
    }

    function f3(){
        function f4(){

        }

        var b = "demoB";

        function f5(){

            var c = "demoC"
        }
    }
</script>
圖解
**作用域鏈**
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末晾腔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啊犬,更是在濱河造成了極大的恐慌灼擂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椒惨,死亡現(xiàn)場離奇詭異缤至,居然都是意外死亡,警方通過查閱死者的電腦和手機康谆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門领斥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沃暗,你說我怎么就攤上這事月洛。” “怎么了孽锥?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵嚼黔,是天一觀的道長。 經常有香客問我惜辑,道長唬涧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任盛撑,我火速辦了婚禮碎节,結果婚禮上,老公的妹妹穿的比我還像新娘抵卫。我一直安慰自己狮荔,他們只是感情好胎撇,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殖氏,像睡著了一般晚树。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雅采,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天爵憎,我揣著相機與錄音,去河邊找鬼总滩。 笑死纲堵,一個胖子當著我的面吹牛,可吹牛的內容都是我干的闰渔。 我是一名探鬼主播席函,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冈涧!你這毒婦竟也來了茂附?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤督弓,失蹤者是張志新(化名)和其女友劉穎营曼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愚隧,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蒂阱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狂塘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片录煤。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荞胡,靈堂內的尸體忽然破棺而出妈踊,到底是詐尸還是另有隱情,我是刑警寧澤泪漂,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布廊营,位于F島的核電站,受9級特大地震影響萝勤,放射性物質發(fā)生泄漏露筒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一敌卓、第九天 我趴在偏房一處隱蔽的房頂上張望邀窃。 院中可真熱鬧,春花似錦、人聲如沸瞬捕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肪虎。三九已至,卻和暖如春惧蛹,著一層夾襖步出監(jiān)牢的瞬間扇救,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工香嗓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迅腔,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓靠娱,卻偏偏與公主長得像沧烈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子像云,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容