好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

JavaScript Function

JavaScript Function

Function 构造 函数 创建 一个 新的 Function 对象。直接 调用 此构造 函数 可用动态创建 函数 ,但会遭遇来自 eval 的安全问题和相对较小的 性能 问题。—— MDN

Function 可以用来创建 函数 ,JavaScript 中的所有 函数 ,都是 Function对象 。

1. 使用 Function 创建 函数

Function 在被当作构造 函数 调用 的时候,可以用来创建 函数 。

  var  fn  =   new   Function  (  函数 参数 ,   函数 参数 ,   ...  ,   函数 参数n ,   函数 体 )  ; 
 

函数 体是 一个 字符串,字符串的 内容 是就是 函数 调用 时候被执行的语句。

  var  fn  =   new   Function  (  'a'  ,   'b'  ,   'return a + b'  )  ; 

 var  result  =   fn  (  ,   )  ; 

console .  log  ( result )  ;   //  输出 :4 
 

将上面创建 函数 的方式“翻译”成常用的创建方式可以是:

  var   fn   =   function  ( a ,  b )   { 
   return  a  +  b ; 
 }  ; 

 var  result  =   fn  (  ,   )  ; 

console .  log  ( result )  ;   //  输出 :4 
 

对比一下就很好理解使用 new Function 时候所传递的参数的含义了。

2. 与常规方式创建 函数 的区别

这里指的常规方式是指 函数 声明 、 函数 表达式 或 ES6 中的 箭头 函数 。

使用 Function 创建的 函数 ,最后 一个 参数,即 函数 体内在执行的时候作用域是在全局的。

  var  num  =   ; 

 function   fn  (  )   { 
   var  num  =   ; 

   var  func  =   new   Function  (  'console.log(num)'  )  ; 

  console .  log  ( num )  ; 

   func  (  )  ; 
 } 

 fn  (  )  ; 

 //  输出 : 
 //  10 
 //  20 
 

这个例子在执行后,依次 输出 了 10 , 20 ,根据结果可以知道 new Function 创建的 函数 ,在执行过程中,上层作用域是顶级的全局作用域,在浏览器下即为 window 。

3. 使用场景

使用 Function 来创建 函数 是比较麻烦的,照道理讲不会有小伙伴会喜欢用这种方式创建 函数 。

Function 的使用主要场景与 eval 类似,用于动态的运行 代码 。

如在线的 代码 解析器就可以配合 Function 完成。

  var   run   =   function  ( code ,  callback )   { 
  window . _callback  =  callback ; 

   var   fn   =   Function  ( code  +   ';_callback()'  )  ; 

   fn  (  )  ; 
 }  ; 


 run  (  'console.log("动态执行的 代码 ");'  ,   function  (  )   { 
  console .  log  (  ' 代码 执行后做的事'  )  ; 
 }  )  ; 
 

这样就可以实现简单的动态运行 代码 。

注意:真正需要完成这个 功能 需要大量的细节处理,如处理 输出 ,处理异步,绝非这么简单。

还有一些 代码 编译工具会将编译后的 代码 ,使用 new Function 进行包裹,如以下 代码 :

  var  number  =   ; 
 var  flag  =   false  ; 

console .  log  ( number ,  flag )  ; 
 

上面这份 代码 在经过编译后可能会变成:

  (  new   Function  (  'console.log(1,!1)'  )  )  (  ) 
 

这样做是为了缩短 代码 ,另外就是让格式化工具无法很好的格式化 代码 。

4. 小结

开发者通常不会通过内建对象 Function 来创建 函数 ,更多的是利用 Function 的特性来动态执行 代码 。

通常情况下 Function 创建的 函数 ,在执行过程中其 this 是指向最顶层的。

JavaScript Math ? ?document.cookie

查看更多关于JavaScript Function的详细内容...

  阅读:38次

上一篇

下一篇

第1节:什么是 JavaScript    第2节:学习环境准备    第3节:调试方案    第4节:JavaScript 变量    第5节:JavaScript 数据类型    第6节:JavaScript if 语句    第7节:for 语句    第8节:JavaScript 算数运算符    第9节:JavaScript 比较运算符    第10节:JavaScript 逻辑运算符    第11节:JavaScript 函数    第12节:JavaScript 表达式    第13节:JavaScript 对象    第14节:JavaScript 字符串    第15节:JavaScript 数字    第16节:JavaScript 数组    第17节:JavaScript switch 语句    第18节:JavaScript while 语句    第19节:JavaScript 的 break 与 continue    第20节:JavaScript with    第21节:document.cookie    第22节:JavaScript Function    第23节:JavaScript Math    第24节:JavaScript Date    第25节:JavaScript RegExp    第26节:JavaScript JSON    第27节:什么是 DOM    第28节:DOM 和 JavaScript 的关系    第29节:获取和操作 DOM 节点    第30节:DOM 与事件    第31节:DOM 事件绑定    第32节:DOM 事件对象    第33节:DOM 事件流    第34节:事件相关的优化    第35节:自定义事件    第36节:表单校验    第37节:什么是 BOM    第38节:常用的 BOM 相关对象    第39节:BOM 常用属性和方法    第40节:AJAX    第41节:异常处理    第42节:三元运算符    第43节:逗号操作符    第44节:void    第45节:typeof    第46节:delete 操作符    第47节:debugger    第48节:getter & setter    第49节:new 运算符与构造函数    第50节:JavaScript 原型    第51节:JavaScript instanceof    第52节:JavaScript this    第53节:严格模式    第54节:作用域    第55节:闭包    第56节:变量提升    第57节:对象包装器    第58节:Lodash    第59节:moment    第60节:swiper    第61节:ECMAScript 6    第62节:Node.js    第63节:Babel    第64节:CSS 预处理器    第65节:代码规范    第66节:TypeScript    第67节:WebComponents    第68节:Vue、React、Angular    第69节:小程序    第70节:JavaScript 关键字    第71节:分号导致的问题    第72节:对象属性访问问题    第73节:this 使用问题    第74节:浮点数精度问题    第75节:独一无二的 NaN    第76节:避免全局污染    第77节:控制台观察对象问题    第78节:根据环境选择语言特性    第79节:相关资源