为什么在运行时调用声明的函数
why is declared function invoked at runtime
仅仅向对象声明一个函数就会导致其调用
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');}
时,会发生以下情况:
- 创建一个新对象
- 构造函数是用指定的参数调用的,它绑定到新创建的对象。如果未指定参数列表,则在没有参数的情况下调用function()
- 构造函数返回的对象将成为整个新表达式的结果。如果构造函数没有显式返回对象,则使用步骤1中创建的对象
相关文章:
- 直接在函数声明上使用function.prototype.bind
- 可以Resharper在我的javascript函数声明中添加分号
- 此行是否包含函数声明
- 函数声明与函数表达式之间的性能差异
- 为什么在javascript函数声明中使用逻辑运算符
- 函数声明未定义-原因
- JavaScript执行从函数声明开始,而不是从$(document).ready()开始
- 杰辛特 |传递默认设置 |函数声明和“this”
- 未知的 JavaScript 函数声明模式
- JavaScript 中的函数声明
- 在函数声明而不是运行时分析所有变量
- 命名函数声明有什么好处吗
- 将一个简单的函数声明形成JavaScript中的闭包
- 返回语句后的函数声明全局变量不会被覆盖
- (this)在函数声明之后
- 为什么使用 ||在变量函数声明中
- 为什么要将函数声明分配给命名变量
- 具有相同参数的 Javascript 函数声明
- 从性能的角度来看,函数声明与表达式
- 为什么 Mozilla Javascript 调试器的断点会捕捉到函数声明