javascript - 为什么在运行时调用声明的函数

时间:2014-09-14 13:38:56

标签: javascript function

仅仅向对象声明函数会导致其调用

var a  = {};
a.xyz = new function() { 
    alert("dosomething");
}

我希望,只有在我调用它时才会调用声明的函数a.xyz

a.xyz();

我的假设出了什么问题?

3 个答案:

答案 0 :(得分:3)

删除新内容,一切都会好起来的:

var a  = {};
a.xyz = function() { 
    alert("dosomething");
}

JSFiddle: http://jsfiddle.net/vnj8pzm1/

编辑:有关IIFE的更多信息 - Immediately-Invoked Function Expression (IIFE)

答案 1 :(得分:3)

当你将new放在函数定义的前面时,你的函数会被立即调用为构造函数。

正如冰上所述,你不应该在你的功能定义面前new。但是,评论中提到的无冰是不正确的

  

new function(){}或new function(){}();将调用函数,就像function(){}();或(function(){}());

new function() {}将创建一个匿名类型的新实例,因此在您的代码中a.xyz是一个对象

如果将其更改为function(){}(),它将立即执行该函数并且不返回任何内容。见http://jsfiddle.net/mendesjuan/kzhg9ggu/

答案 2 :(得分:3)

简而言之:

new运算符使用new创建对象的实例,这就是为什么在声明之后立即执行。

不那么短

xyz= function(){};

将对匿名函数的引用放入xyz并指向函数。

xyz= new function(){};

对新构造的匿名构造函数实例进行引用,因此它将指向一个对象。试试typeof new function(){}你会得到一个对象。

执行代码new function(){alert('foo');}时,会发生以下情况:

  1. 创建新对象
  2. 使用指定的参数调用构造函数,并将其绑定到新创建的对象。如果没有指定参数列表,则调用function()而不带参数。
  3. 构造函数返回的对象成为整个新表达式的结果。如果构造函数未显式返回对象,则使用在步骤1中创建的对象。