原生JS中應該禁止出現的寫法
阿新 • 來源:網路 • 發佈:2021-05-06
塊級函式
嚴格模式下,在 ES6 之前應禁止使用。ES6 開始可以使用,函式的作用域為宣告該函式的塊內部。非嚴格模式下應禁止使用。
if(true) {
function test() { //塊級函式
console.log(1);
}
}
test();
直接修改物件的 prototype 原型
瀏覽器對原型進行了優化,在呼叫例項之前,會為物件的方法提前規劃記憶體位置。所以不可以直接修改 prototype 原型。以下兩種方法都應禁止使用
使用 Object.setPrototypeOf 修改原型
function a(){}
a.prototype = {
a_prop: "a val"
};
function b(){}
var proto = {
b_prop: "b val"
};
Object.setPrototypeOf(
proto,a.prototype
);
b.prototype = proto;
var test = new b;
console.log(test.a_prop); // a val
console.log(test.b_prop); // b val
直接修改物件的 __proto__ 屬性
function a(){}
a.prototype = {
a_prop: "a val"
};
function b(){}
var proto = {
b_prop: "b val",__proto__: a.prototype //直接修改 b 物件的 __prototype__ 屬性
};
b.prototype = proto;
var test = new b;
console.log(test.a_prop); // a val
console.log(test.b_prop); // b val
with
with 的用法:
var a = {
p1: 1,p2: 2
}
with (a) {
p1 = 3;
}程式設計客棧
console.log(a.p1);
應該禁止使用 with,例如:
function a(arg1,arg2) {
with (arg2){
console.log(arg1); // 無法確定是要輸出第一個引數還是要輸出 arg2 的 arg1 屬性
}
}
var arg2 = {arg1:1}
a("arg1",arg2)
callee
arguments.callee 表示當前正在執行的函式:
function a(arg1) {
if (arg1 > 1) {
return arg1 * arguments.callee(arg1 - 1);
}
else {
return 1;
}
}
console.log(a(3)); // 6
當一個函式必須呼叫自身的時候,應禁止使用arguments.callee(),直接通過函式名字呼叫該函式。
function a(arg1) {
if (arg1 > 1) {
return arg1 * a(arg1 - 1); // 直接通過函式名稱呼叫
www.cppcns.com }
else {
return 1;
}
}
console.log(a(3)); // 6
caller
caller 表示函式www.cppcns.com的呼叫者,應禁止使用,該特性不是標準的。
function a() {
console.log(a.caller); // function b() { a(); }
}
function b() {
a();
}
b();
eval
eZniwpXpval() 可以把傳入的字串引數當成javascript程式碼執行。
eval("var a = 1,b = 2; 程式設計客棧console.log(a+b)"); // 3
禁止使用 eval。eval 比一般javaScript執行要慢,因為瀏覽器對 javascript 進行了優化。eval 方法也不安全,因為它使用與呼叫者相同的許可權執行程式碼,而且 eval() 被呼叫時,它的作用域也會暴露。應該用 Function 代替:
var a = new Function("a","b","console.log(a+b)")
a(1,2); // 3
以上就是原生js中應該禁止出現的寫法的詳細內容,更多關於原生JS中應該禁止的寫法的資料請關注我們其它相關文章!
