有人可以解释以下两个IIFE块之间的区别:
a) (f1 = function(){console.log('IIFE Block1')})()
b) (var f1 = function(){console.log('IIFE Block2')})()
我理解“b)”在执行时会抛出错误。 定义变量“f1”有什么用,它的属性是什么。
答案 0 :(得分:2)
a
仅在严格模式之外工作。 f1
被隐式定义为全局变量,并设置为IIFE的值。如果您在严格模式下尝试此操作,则会引发错误,因为f1
未使用var
,let
,const
或作为函数显式声明参数:
function quirks() {
(f1 = function() { return 'f1 IIFE'; })();
return f1;
}
console.log(quirks());
function strict() {
"use strict";
(f2 = function() { return 'f2 IIFE'; })();
return f2;
}
console.log(strict());

答案 1 :(得分:1)
第一个没有使用声明关键字,因此f1
将变为全局(这违背了IIFE的目的)。但是,这是表达式的合法语法 - 可以调用该函数,并将结果(如果有)分配给use strict
。请注意,这不会与(f1 = function(){console.log('IIFE Block1')})()
// f1 is Global and can be accessed from anywhere
console.log(f1);
生效。
(var f1 = function(){console.log('IIFE Block2')})()

第二个失败是因为它的IIFE语法无效 - 它是声明和赋值语句,它不是可以计算的表达式。
import datetime
now = datetime.datetime.now()
print (now.day, "/", now.month, "/", now.year)

答案 2 :(得分:1)
除了所有伟大的答案之外,你会发现大部分都是语法上的限制。您可以将第一个在window
对象上运行的方法应用于任何其他已定义的对象:
(f1 = function(){console.log('IIFE Block1')})()
console.log(f1);
// managed object
var local = {};
(local.f2 = function(){console.log('IIFE Block2')})()
console.log(local.f2);
// or any predefined variable
var f3;
(f3 = function(){console.log('IIFE Block3')})()
console.log(f3);
// just not in the parens
// (var f4 = function(){console.log('IIFE Block4')})()
// console.log(f4);