Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 立即执行的函数和使用关键字new有什么区别?_Javascript - Fatal编程技术网

Javascript 立即执行的函数和使用关键字new有什么区别?

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

在学习javascript闭包的过程中,我遇到了一个使用立即执行的函数为函数提供私有变量的示例:

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:但是,:-)