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

why is declared function invoked at runtime

本文关键字:函数 声明 调用 运行时 为什么      更新时间:2023-09-26

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

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

我预计,声明的函数a.xyz只有在我调用它时才会被调用:

a.xyz();

我的假设有什么错?

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

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

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

编辑:有关IIFE的更多信息-立即调用函数表达式(IIFE)

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

正如iceless所提到的,您的函数定义前面不应该有new。然而,iceless在评论中提到的是不正确的

new function(){}或new function(;将像function(){}()一样调用函数;或(function(){}());

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

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

简而言之:

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

简而言之

xyz= function(){};

将对匿名函数的引用放置到xyz中并指向某个函数。

xyz= new function(){};

放置对匿名构造函数的新构造实例的引用,以便它指向对象。尝试typeof new function(){},您将得到对象。

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

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