2017-02-14 87 views
0

围绕Web的许多不同文章都声称在设计模块(类似于jQuery)时使用全局导入的巨大优势。全局导入变量和IIFE

所以,做这样的事情......

(function(globalVariable){ 
    globalVariable.printStuff = function(){ 
    console.log(‘Hello World’) 
    }; 
}(globalVariable)); 

...意味着我可以调用一个函数是这样的:

globalVariable.printStuff(); 

的问题是,每当我运行这个在控制台中,我不断收到:

globalVariable undefined 

我的问题是,我到底需要声明这个变量,我可以得到这个工作?

+1

什么用'globalVariable.printStuff()是高达{/ *这是什么连? * /};'? – Phil

+3

虽然它不是解决方案,但要注意''Hello World'''''''''''''''''''''''''''''''''''''''''''''''。另外,你是否真的定义了一个名为'globalVariable'的变量,并传递给你的IIFE? – haxxxton

+0

我希望此函数中的所有函数不污染全局名称空间并最大限度地减少与其他脚本的冲突。所以,我希望拥有像globalVariable这样的东西可以让我定位这些私人功能。 – Modermo

回答

1

对于这样一个真正的单模,你不需要任何IIFE。只写一个对象文字:

var globalVariable = { 
    printStuff: function() { 
     console.log('Hello World'); 
    } 
}; 

globalVariable.printStuff(); 

如果你想使用一个IIFE范围,你仍然需要在某处创建对象。这可能是在模块内部还是外部的:

var globalVariable = (function() { 
    var module = {}; 
    var localVariable = 'Hello World'; 
    module.printStuff = function() { 
     console.log(localVariable); 
    }; 
    return module; 
}()); 

globalVariable.printStuff(); 

var globalVariable = {}; 

(function(module) { 
    var localVariable = 'Hello World'; 
    module.printStuff = function() { 
     console.log(localVariable); 
    }; 
}(globalVariable)); 

globalVariable.printStuff(); 
+0

就是这样!我试图将globalVariable声明为'var globalVariable;'。为什么它需要定义为一个对象? – Modermo

+0

因为你想创建它的属性... – Bergi

+0

当然:)现在有道理。感谢澄清。 – Modermo

0

对于浏览器window对象是存储所有全局变量的对象。下面的代码显示了具有全局变量的IIFE的基本实现。

//Set a variable 'globalVariable' in the window object 
 
window.globalVariable = 10; 
 

 
//Access the global variable 'globalVariable' in IIFE 
 
(function(globalVariable) { 
 
console.log(globalVariable); 
 
})(globalVariable);

+0

为什么我要这么做? – 2017-02-14 05:03:00

+0

我的目的是向你解释全局变量如何在使用IIFE的JavaScript中工作 –