[Effective JavaScript 笔记]第16条:避免使用eval创建局部变量
2016-05-24 10:35
204 查看
js中的eval函数是一个强大、灵活的工具。强大的工具容易被滥用,所以了解是值得的。(本人只用过它来处理json数据)。
错误使用eval函数的方式一:允许它干扰作用域。
调用eval函数会将其参数作为js程序进行解释。
该程序运行于调用者的局部作用域中,嵌入到程序的全局变量会被创建为调用程序的局部变量。
此var声明语句与将其直接放置在函数体中的行为是不同的。
直接放入的变量声明,会有变量声明的提升。
通过eval放入的,只有当eval函数被调用时此var声明语句才会被调用。变量才会加入到作用域。
基于作用域决定程序的动态行为,会导致即使简单地理解变量是如何绑定的都需要了解程序执行的细节。当源代码将未在局部作用域内定义的变量传递给eval函数时,程序将变得很脆弱,结构很容易被破坏。
赋予外部调用者能改变函数内部作用域的能力。期望eval函数能修改自身包含的作用域对ES5严格模式的兼容性也是不好的。ES5严格模式将eval函数运行在一个嵌套的作用域中以防止这种污染。
保证eval函数不影响外部作用域的一个简单方法是在一个明确的嵌套作用域中运行它。(这样可以不破坏,外部函数的实际功能)
如果eval函数代码可能创建全局变量,将此调用封装到嵌套的函数中以防止作用域污染。
错误使用eval函数的方式一:允许它干扰作用域。
调用eval函数会将其参数作为js程序进行解释。
该程序运行于调用者的局部作用域中,嵌入到程序的全局变量会被创建为调用程序的局部变量。
此var声明语句与将其直接放置在函数体中的行为是不同的。
直接放入的变量声明,会有变量声明的提升。
通过eval放入的,只有当eval函数被调用时此var声明语句才会被调用。变量才会加入到作用域。
基于作用域决定程序的动态行为,会导致即使简单地理解变量是如何绑定的都需要了解程序执行的细节。当源代码将未在局部作用域内定义的变量传递给eval函数时,程序将变得很脆弱,结构很容易被破坏。
赋予外部调用者能改变函数内部作用域的能力。期望eval函数能修改自身包含的作用域对ES5严格模式的兼容性也是不好的。ES5严格模式将eval函数运行在一个嵌套的作用域中以防止这种污染。
保证eval函数不影响外部作用域的一个简单方法是在一个明确的嵌套作用域中运行它。(这样可以不破坏,外部函数的实际功能)
提示
避免使用eval函数创建的变量污染调用者的作用域如果eval函数代码可能创建全局变量,将此调用封装到嵌套的函数中以防止作用域污染。
相关文章推荐
- 请问如何修改jeecms后台管理系统中的下一页的js中的跳转路径
- MVC JsonResult的用法
- Three.js学习笔记 – “我和小伙伴都惊呆了”的特效和Three.js初探(转)
- js 获取url 参数 中文乱码问题
- JavaScript生成并下载csv文件
- 深入理解JavaScript
- 后台给GridView绑定数据时给每一行添加一个JS方法
- js-比较两个日期的大小
- JavaScript高级程序设计(读书笔记)(四)
- js中onclick字符串传参问题
- js数组操作大全(pop,push,unshift,splice,shift方法)
- JavaScript学习1
- 使用json文件为当前类文件属性赋值(org.nutz.json.Json)
- 常规功能和模块自定义系统 (cfcmms)—045模块导航功能的重构(3)导航的定义
- Effective JavaScript :第六章
- Effective JavaScript :第五章
- 检测使用 three.js 时的 WebGL 和浏览器兼容性(Detecting WebGL and browser compatibility with three.js)(转)
- 命名函数表达式
- 数据抓包+hijson
- 使用ajaxupload.js插件上传图片不成功问题----RTFSC