将属性附加到函数对象是否安全/可接受?

时间:2014-07-25 14:24:53

标签: javascript function object properties

我们说我有一个功能。

function foo() {
    var bar = true;
    if(bar) {
        //Do x
    }
}

在此示例中,bar是一些条件,就像正则表达式一样。我希望它可以全局访问,因此我可以更改条件并再次运行foo()。我可以通过使它成为一个全局变量来做到这一点:

var bar = true;

function foo() {
    if(bar) {
        //Do x
    }
}

foo();
bar = false;
foo();

或函数的参数:

function foo(bar) {
    if(bar) {
        //Do x
    }
}

foo(true);
foo(false);

甚至是一个单独的全局对象:

var foo_options = {
    bar: true
};

function foo() {
    if(foo_options.bar) {
        //Do x
    }
}

foo();
foo_options.bar = false;
foo();

我想避免创建一个单独的全局变量来保存条件,因为看起来不必要的杂乱导致有一个全局变量(即使它的名字很好)来保存一些真正只使用过的东西在一个地方。我不想将条件作为参数传递,因为这个函数将被多次调用,实际上我可能无法控制调用该函数的参数。由于类似的原因,全局对象似乎不需要全局变量,但它也非常笨重。

我目前正在考虑为foo()函数提供一个属性,这可能是因为JavaScript将函数(以及几乎所有不是字符串或数字的函数)视为对象:

function foo() {
    if(foo.bar) {
        //Do x
    }
}
foo.bar = true;

foo();
foo.bar = false;
foo();

我已经对此进行了测试,这是可能的,但我担心这是一个好主意还是危险的。建议?

3 个答案:

答案 0 :(得分:2)

向默认对象添加属性通常不赞成,但是,如果您不替换标准属性(例如length),那么您应该没问题。

更清洁的解决方案是使用闭包来存储变量,使用函数工厂:

function makeFoo(foo_options){
    return function(){
      console.log("bar : ", foo_options.bar);
    }
}
var foo1 = makeFoo({bar:3}),
    foo2 = makeFoo({bar:0});
foo1(); // logs bar : 3
foo2(); // logs bar : 0

额外的好处是你可以简单地使用不同选项的几个函数。

答案 1 :(得分:1)

您可以将函数和变量绑定到单个对象吗?更安全,不会修改默认对象。

var myObject = {
    foo : 1234,
    bar : function(){
        console.log(this.foo)
    }

}

myObject.bar();

答案 2 :(得分:0)

对于这个问题,函数工厂可能是已经建议的最简单,最有意义的解决方案。 一个不同的解决方案,如果您希望有一个“单例”而不是每次想要更改选项时创建新函数的函数工厂,那么将使用一个带有“接口对象”的闭包:

var Foo = (function() {
  var bar = true;

  function foo() {
    if(bar) {
      //Do x
    }
  }

  return {
    setBar: function(b) {
      bar = b;
    },
    getBar: function() {
      return bar;
    },
    foo: foo
  };
}());

Foo.setBar(false);
Foo.foo();