本文探讨JavaScript中eval与new Function在语法检查中的差异,指出eval在IE浏览器中返回undefined的兼容性问题及“0,”前缀修复法。同时介绍利用Array.prototype.concat合并数组的技巧,并对比instanceof判断方式,提供实用的前端开发代码优化方案。
使用 new Function 进行语法检查
采用 new Function() 构造函数执行语法校验。
eval() 函数的使用需极为谨慎,不当调用可能引发整个程序的运行错误。
相比之下,new Function() 的风险较低。尽管该构造函数生成的函数始终在全局作用域中执行,但只要不直接调用该新函数,仅用于语法检查时便不会因作用域差异导致意外结果。
解决 IE 中 eval 的兼容性问题
在 eval() 接收的参数前添加“0,”。
这一做法主要源于 Internet Explorer 浏览器中存在的一个特定缺陷。若需在 IE 环境中通过 eval() 动态构建函数,需特别注意此问题。
具体示例如下。
eval('(function(){ /* code here */ })');
在 IE 浏览器中执行上述代码,返回值将为 undefined;而在其他主流浏览器中,则能正确返回所构造函数的引用。
最简便且有效的跨浏览器兼容方案是:在代码字符串前加上“0,”,即可确保在所有主流浏览器中正常运行。
具体示例如下。
eval('0,function(){ /* code here */ }');
需要注意的是,在 IE9 采用的 Chakra 引擎中,该缺陷已得到修复。
利用 concat 方法合并数组
利用数组对象的 concat 方法生成新数组。
若需将单个对象参数转换为仅含一个元素的数组进行处理,可采用“[ ].concat(o)”的形式。
具体示例如下。
代码如下:
var arr1 = [1,2];
var arr2 = [3,4];
var arr3 = arr1.concat(arr2);
alert(arr3.length); 另一种实现方式为:if (!(o instanceof Array)) o = [o];
这种方式与 ECMAScript 5 标准中的 isArray 方法相比,严谨性稍显不足。
网友回复:
1.eval 确实不能乱用;
2.在IE eval 的时候,我的解决方法是在执行函数体内return ;
3.Array.prototype.concat.apply([1,2,3],[4,5,6]);