代码之家  ›  专栏  ›  技术社区  ›  R.J. Dunnill

定义一个包含变量,然后立即覆盖它

  •  0
  • R.J. Dunnill  · 技术社区  · 7 年前

    在Javascript代码库中可以找到以下模式。变量是用它的值(如果它已经存在)或空对象来定义和初始化的。然后立即覆盖。

    var outerVariable = outerVariable || {};
    outerVariable = {
        // inner variable definitions follow
        // ...
    };
    

    这种模式有用吗?

    3 回复  |  直到 7 年前
        1
  •  3
  •   jsdeveloper    7 年前

    不,我不认为这是做任何有用的-你不妨写:

    var outerVariable = {
        // inner variable definitions follow
        // ...
    };
    

    是否已经定义了outerVariable并不重要,因为我们可以覆盖它( Declaring a Javascript variable twice in same scope - Is it an issue? ).

    使用“let”和“const”是另一回事。。不能重新定义这些变量。

        2
  •  -1
  •   Slawomir Dziuba    7 年前

        3
  •  -1
  •   Community Mohan Dere    5 年前

    在文件顶部看到的这种特殊模式用于创建一个名称空间,即一个命名对象,在该对象下可以创建函数和变量,而不会过度污染全局对象。

    1防止超控:

    假设您将代码拆分为多个文件,并且您的同事也在处理一个名为 Base . 这样就有可能导致某个人已经定义了 pizza 函数)。如果你不检查它是否已经存在,你就会覆盖它。

    // Definition of co-worker "A" in "A.js"
    var Base = {};
    
    Base.pizza = function() {
      alert('I like pizza!');
    };
    
    // Definition of co-worker "B" in "B.js"
    var Base = {};
    
    Base.donut = function() {
      alert('I like donuts!');
    };
    

    在这种情况下 披萨 B.js A.js 因为 B 定义新的 底座 对象(从而覆盖 A )所以它只知道 donut 功能。

    var Base = Base || {}; 这意味着 底座 底座 (如果已经存在)或新的空白对象(如果 不存在)。

    解决方案

        var Base = Base || {};
        
        // Definition of co-worker A in A.js
        Base.pizza = function() {
          alert('I like pizza!');
        };
        // Definition of co-worker B in B.js
        var Base = Base || {};
        
        Base.donut = function() {
          alert('I like donuts!');
        };
    

    A.js公司 B.js公司 不重写彼此的方法(如果它们有不同的名称)。所以你会得到一个 底座 具有方法的对象 披萨 甜甜圈 (干杯!)。

    如果你已经通读了第一个例子,那么你现在已经知道 || {} .

    因为如果不存在 对象,则OR case将变为活动状态并创建一个新对象,以便您可以为其分配函数。比如:

    var Base = {};
    
    Base.pizza = function() {
      alert('I like pizza!');
    };