嚴格模式

嚴格模式->一種特殊的運行模式,修復了部分語言上的不足,增加了安全性

"use strcit";

    以下倆個代碼說出了"use strict"的小坑 

    var a = 10;

    "use strict"; //由於前面有var 語句了 所以"use strict"語句失效

    b = 20; 

    console.log(b); //20


    前面只是字面量就不會失效

    "a b b b b a";

    "use strict";

    a = 10;

    console.log(a);  


    function foo(a){

        arguments[0] = 100;  //假若不傳參數的話a始終爲undefined

        console.log(a);

    }

    foo(10);  //100

    foo();  //undefined 


    嚴格模式下不能使用with語句

    嚴格模式下不能不用var 來聲明變量

    嚴格模式下arguments變爲參數,對基本類型的參數無影響,對引用類型仍然有影響

    嚴格模式下delete參數,函數名,(var a的)a將會報錯

    嚴格模式下delete不可配置的屬性也會報錯

    嚴格模式下delete一個未定義的屬性或者值報錯,一般情況下返回true

    嚴格模式下對象字面量重複屬性名時會出錯

    嚴格模式下禁止八進制字面量

    嚴格模式下禁止eval,arguments最爲函數名,變量名

    嚴格模式下arguments.callee,argumenst.caller,caller屬性都不可以使用

    function foo(a){

        arguments[0] = 100;

        console.log(a);

    }

    foo(10);  //100

    function foo(a){

        "use strict";

        arguments[0] = 100;

        console.log(a);

    }

    foo(10);  //10   

    function foo(obj){

        arguments[0].x = 100;

        console.log(obj.x);

    } 

    foo({x:10}); //100

    function foo(obj){

        "use strict";

        arguments[0].x = 100;

        console.log(obj.x);

    } 

    foo({x:10}); //100


    function foo(a){

        console.log(a);

        console.log(delete a); //false

        console.log(delete foo);  //false

    };

    foo(1);


    function foo(a){

        "use strict";

        console.log(a);

        console.log(delete a); //嚴格模式下報錯

        console.log(delete foo);  //嚴格模式下報錯

    };

    foo(1);


    var obj = {};

    Object.defineProperty(obj,"x",{

        value: 1,

        writable: true,

        configurable: false, //可配置性

        enumerable: true   //可枚舉性

    });

    for (a in obj){

        console.log(a);

    }

    console.log(delete obj.x);  //false

    console.log(delete x);   //delete一個爲定義的屬性或者值 返回true


    "use strict";

    var obj = {};

    Object.defineProperty(obj,"x",{

        value: 1,

        writable: true,

        configurable: false, //可配置性

        enumerable: true   //可枚舉性

    });

    for (var a in obj){

        console.log(a);

    }

    console.log(delete obj.x);  //false

    console.log(delete x);   //delete一個爲定義的屬性


    var obj = {

        x: 1,

        x: 2

    }; //一般狀況下這種事正常的,而且以最後一個爲準

    console.log(obj.x);  //2


    "use strict";

    var obj = {

        x: 1,

        x: 2       //報錯

    };

    console.log(obj.x); 


    console.log(0123);  //8進制自動轉爲10進制輸出


    "use strict";

    console.log(0123);   //報錯


    function eval(){

        console.log(1);

    }

    eval();  //一般模式下正常

    var arguments = 10;

    console.log(arguments);   //一般模式下正常


    "use strict";

    function eval(){

        console.log(1);

    }

    eval();  //報錯

    var arguments = 10;

    console.log(arguments);   //報錯


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章