JavaScript函数()&函数()

时间:2016-06-15 18:28:53

标签: javascript function constructor

我最近一直在研究新运营商的用途,特别是用于创建功能时。我一直在玩/测试从不同的函数实例返回的内容。你们可以澄清一些关于函数实例化的问题:

我知道你可以使用function关键字创建一个函数:

new function() { *statements*}

或通过调用函数构造函数:

new Function(*arg1, functionBodyString*);

据我所知,使用new运算符会调用函数(构造函数)来创建函数(函数对象)。但我也可以看到函数关键字被用作创建一个与其他语言同样意义上的实际函数。

  1. 函数关键字是用于创建函数的语法糖,允许您在函数之后声明函数体 创建,而不是将一组语句作为字符串传递 就像使用Function构造函数一样?
  2. 在创建函数时,Function()构造函数在构造期间是否调用了函数体?我会这样认为,因为以这种方式创建一个函数可以使用它的内部函数。
  3. function()和new function()有什么区别?我读过这里没有什么区别,但区别在于使用new运算符使其所有内部函数都可用(因此问题2)但不使用它需要您调用该函数以实现其内部属性。那里发生了什么?
  4. 谢谢! :)

    P.S

    澄清问题2:

    当我这样做时

    new function(){ this.myFunction = function(){ ... }}

    函数'myFunction'可用。但是当我做的时候

    function(){ this.myFunction = function(){ ... }}

    函数'myFunction'不可用。为什么是这样?是因为新函数/构造函数执行函数体吗?新的运营商在这做什么来支持这个?

2 个答案:

答案 0 :(得分:3)

  

函数关键字是用于创建函数的语法糖,允许您在函数创建后声明函数体,而不是像使用函数构造函数那样将一组语句作为字符串传递吗?

不,不是。 function关键字允许关闭,Function cosntructor不允许。

  

在创建函数时,Function()构造函数在构造期间是否会调用它的函数体?我会这样认为,因为以这种方式创建一个函数可以使用它的内部函数。

我不确定你的意思"呼吁"这里。它解析它,是的,它没有评估它,没有。

  

是因为新函数/构造函数执行函数体吗?

new Function(…)中,只创建了一个函数对象,但没有执行任何操作。在new (function(){ … })中,new operator正在执行该功能,就像您执行

一样
var constructor = function() { … };
new constructor; // parenthesis are optional
  

function()new function()之间有什么区别?我读过这里没什么区别,但区别在于使用new运算符使其所有内部函数都可用(因此问题2)但不使用它需要你为它调用该函数&# 39;要实例化的内部属性。那里发生了什么?

function(…) {…}function expression or declaration

new function(){ … } is an antipattern,永远不要使用。

答案 1 :(得分:1)

  1. 使用关键字实际上是实例化函数的首选方式,因为它有许多内置的优化。但我想,当它归结为它时,它只是合成糖。

  2. 当您使用new时,将使用新对象作为其this上下文调用该函数。使用new,您的示例根本不会调用该函数,因此无法完成任务。

  3. 他们非常不同。 function(){}创建一个函数。 new function(){}创建了一个对象。

  4. 想想new Date()。存在function Date(){},它是一个构造函数。它在新对象上设置属性和方法。

    可能值得阅读how the new operator works