嚴格模式->一種特殊的運行模式,修復了部分語言上的不足,增加了安全性
"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); //報錯