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

Javascript 将属性附加到函数对象是否安全/可接受?,javascript,function,object,properties,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

假设我有一个函数

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

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

向默认对象添加属性通常是不受欢迎的,但是,如果您不替换标准属性(例如
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

附加的好处是,您可以简单地拥有多个具有不同选项的函数。

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

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

}

myObject.bar();

对于这个问题,函数工厂可能是最简单和最有意义的解决方案,就像已经建议的那样。 另一种解决方案是,如果您希望使用“单例”而不是每次更改选项时都会创建新函数的函数工厂,则可以使用带有返回的“接口对象”的闭包:

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

有时会这样做,但大多数情况下,你可以在闭包中定义一个变量。只要你不重写任何现有的属性……哦,我已经给出了答案。我不确定它是否有用。如果不是,我就把它拿走。