Javascript 立即执行的函数和使用关键字new有什么区别?
在学习javascript闭包的过程中,我遇到了一个使用立即执行的函数为函数提供私有变量的示例:Javascript 立即执行的函数和使用关键字new有什么区别?,javascript,Javascript,在学习javascript闭包的过程中,我遇到了一个使用立即执行的函数为函数提供私有变量的示例: var add = (function () { var counter = 0; return function () {return counter += 1;} })(); 但对我来说,所有立即执行的函数都是执行主体中的语句,如果我回忆正确,可以通过关键字new var add=新函数(){ var计数器=0; 返回函数(){return counter+=1;} }; d
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
但对我来说,所有立即执行的函数都是执行主体中的语句,如果我回忆正确,可以通过关键字new
var add=新函数(){
var计数器=0;
返回函数(){return counter+=1;}
};
document.write(“return”+add()+“
”);//返回1
document.write(“return”+add()+“
”);//返回2,与w3school上的示例相同
f()
和new f
几乎相同(比较和)。当然,new
在准备要扔掉的对象时要做更多的工作
如果出现以下情况,则不能盲目地将f()
替换为new f
- 您在
中使用的是f
(显然)此
- 您正在返回非对象
x = 5 + (function () {
return 123;
})();
y = 5 + new function () {
return 123;
};
在其他情况下,如果您不介意浪费资源和验证程序对您大喊大叫,
new
就可以了。如果您真的想学习JS,请尽量远离“W3Schools”。它们不是自调用的,而是立即执行的。自调用意味着它调用自己(例如递归),而在您的代码中它不这样做。“我相信新函数可以替换立即执行的函数”——它不能,它们是不同的。IIFE创建一个作用域,new
使用构造函数创建对象。目的完全不同。@JeremyBank它不干净:它混淆了意图和实现。“干净”的代码是一个用代码提供的习惯用法和语义显式表达意图的代码。从这个角度来看,“使用构造函数创建新实例”和“仅调用函数”是使用两种不同的语言构造执行的两个不同任务。@zerkms,你说过“IIFE的目的是创建一个从其他任何地方都不可用的局部作用域”,它也可以通过使用new来实现,因此从功能角度来看,IIFE是可替换的?我想说,在使用new
调用后使用this
实际上比在标准IIFE中使用this
更安全,因为没有意外命中全局命名空间的风险。:)@JeremyBanks:关键是,如果你使用this
,这两种形式是不等价的。有趣的是……你能解释一下第二个例子的行为吗?在这个例子中,新函数试图返回一个原语?我刚刚运行了一个测试,返回值的类型是object@watashiSHUN:如果返回标量,new
将忽略它并返回新构造的对象。@JeremyBanks:但是,:-)