本文章记录本人在学习 JavaScript 中看书理解到的一些东西,加深记忆和而且整理记录下来,方便以后的复习。浏览器
若是在代码中使用了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()
构造函数和eval()
是比较相似的,所以该函数的使用也须要十分当心。该函数是一个功能强大的函数,可是一般容易被误用。若是必定要使用eval()
的话,能够考虑是new Function()
来代替eval()
。这样作的一个潜在的好处就是因为在new Function()
中的代码将在局部变量函数空间中运行,所以代码中任何采用var
定义的变量不会自动成为全局变量(下面一个栗子)。code
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
,它都仅仅能看到全局做用域。所以对局部变量的影响比较小(下面一个栗子)。ip
(function(){ var local = 1; eval("local = 3; console.log(local)"); console.log(local); // 3 }()); (function(){ var local = 1; Function("console.log(typeof local);")(); // undefined }());
来自MDN:在严格模式下 eval 仅仅为被运行的代码建立变量, 因此 eval 不会影响到名称映射到外部变量或者其余局部变量(下面一个栗子)。作用域
var x = 17; var evalX = eval("'use strict'; var x = 42; x"); assert(x === 17); assert(evalX === 42);
更多的详细内容:严格模式 MDN字符串
最后,若是文章有什么错误和疑问的地方,请指出。与sf各位共勉!