在IIFE块中定义变量

时间:2018-03-08 05:20:38

标签: javascript iife

有人可以解释以下两个IIFE块之间的区别:

a) (f1 = function(){console.log('IIFE Block1')})()
b) (var f1 = function(){console.log('IIFE Block2')})()

我理解“b)”在执行时会抛出错误。 定义变量“f1”有什么用,它的属性是什么。

3 个答案:

答案 0 :(得分:2)

a仅在严格模式之外工作。 f1被隐式定义为全局变量,并设置为IIFE的值。如果您在严格模式下尝试此操作,则会引发错误,因为f1未使用varletconst或作为函数显式声明参数:



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);