JS进修笔记 - eval() 是魔鬼

本文章记录本人在进修 JavaScript 中看书明白到的一些东西,加深影象和而且整顿记录下来,轻易以后的温习。

小白运用 eval()

假如在代码中运用了eval(),请记着一句话:“eval()是一个魔鬼”。该函数能够将恣意的字符串当作一个js代码来实行。当须要议论的代码是预先编译好了(不是在动态运转时刻决议),是没有来由运用eval()的。比方,假如你晓得点示意法,然则不晓得下表示意法的状况(下面一个栗子)。

eval("myValue = myObject." + myKey + ";");

而不是如许写(下面一个栗子)。

myValue = MyObject[myKey];

安全隐患

运用eval()是有一些安全隐患的,因为如许做有能够实行被篡悛改的代码(比方来自收集的代码)。这是在处置惩罚来自一个Ajax要求的JSON相应时刻罕见的反形式。在那些情形下,最好是运用浏览器内置的要领来剖析JSON要求,以确保安全性和有效性。

另有eval()函数还削弱了应用程序的安全性,因为他给被要求的文本给予了太多的权利,而且就像with语句实行的体式格局一样,它降低了言语的机能。

定时器

在编写js殊效的时刻,会经常使用setTimeout、setInterval()要领。要切记运用这些组织函数来通报参数,在大部分状况下,会致使相似eval()的隐患,因而应当也只管防止运用这些函数。(下面一个栗子)

// bad
setTimeout("myFunc()", 1000);
setInterval("myFunc(1, 2, 3)", 1000);

// good
setTimeout(myFunc, 1000);
setInerval(function(){
    myFunc(1, 2, 3);
}, 1000);

new Function()

运用new Function()组织函数和eval()是比较相似的,因而该函数的运用也须要非常警惕。该函数是一个功能强大的函数,然则一般轻易被误用。假如一定要运用eval()的话,能够斟酌是new Function()来替代eval()。如许做的一个潜伏的优点就是因为在new Function()中的代码将在局部变量函数空间中运转,因而代码中任何采纳var定义的变量不会自动成为全局变量(下面一个栗子)。

console.log(typeof un); // undefined
console.log(typeof deux); // undefined
console.log(typeof trois); // undefined

var jsstring = "var un = 1; console.log(un);"
eval(jsstring); // 1

jsstring = "var deux = 2; console.log(deux);"
eval(jsstring); // 2

jsstring = "var deux = 2; console.log(deux);"
(function(){
    eval(jsstring);
}()); // 3

console.log(typeof un); // number
console.log(typeof deux); // undefined
console.log(typeof trois); // undefined

另有就是eval()是会影响到作用域链的,而Function更像一个沙盒。不管在那里实行Function,它都仅仅能看到全局作用域。因而对局部变量的影响比较小(下面一个栗子)。

(function(){
    var local = 1;
    eval("local = 3; console.log(local)");
    console.log(local); // 3
}());

(function(){
    var local = 1;
    Function("console.log(typeof local);")(); // undefined
}());

严厉形式下的 eval()

来自MDN:在严厉形式下 eval 仅仅为被运转的代码建立变量, 所以 eval 不会影响到称号映照到外部变量或许其他局部变量(下面一个栗子)。

var x = 17;
var evalX = eval("'use strict'; var x = 42; x");
assert(x === 17);
assert(evalX === 42);

更多的细致内容:严厉形式 MDN

末了,假如文章有什么毛病和疑问的处所,请指出。与sf列位共勉!

    原文作者:_我已经从中二毕业了
    原文地址: https://segmentfault.com/a/1190000002918864
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞