javascript函数是对象吗?

mar*_*ark 10 javascript scope function object

我现在正在努力解决一个Javascript问题,我无法在网上找到解释.我想这是因为我没有输入正确的关键字,这也可能与我为什么要挣扎这个问题有关.

我的基本假设是可以改变对象:

> var x = {'n': 2};
> x['n']
2
> x['n'] = 3;
3
Run Code Online (Sandbox Code Playgroud)

pheww工作.但仍然(函数也是对象):

> var addn = function(a) {
    var n = 2;
    return n + a;
}

> addn(3);
5
> addn['n'] = 3;
3
> addn(3);
5
Run Code Online (Sandbox Code Playgroud)

这次我无法改变'n'.有没有办法解决这个问题,同时保持功能的味道?而不是完全OO.我有一个相关的问题是如何维护函数的依赖性以便进行测试 - 再次没有OO?因为我正在寻找解决方案,但如果可能的话,我也想了解Javascript中的哪种机制让我苦苦挣扎.

干杯,

标记

免责声明:通过提及OO我不打算对OO说任何话.而且我也不打算对VI或Emacs说任何话.如果我以某种方式伤害了你的感情,请跳过这个.

Ale*_*yne 16

函数作用域中的私有变量和对象的属性是两个非常不同的东西. var n在该函数内部完全无法从该函数外部访问.

因此,在代码运行之后,每次运行函数时都会初始化addn.n == 3设置的不同值var n.由于javascript的怪癖,一个函数无法真正访问它自己的属性非常容易.相反,通过传递参数可以更好地实现这种模式function(n, a)

或者使用一个对象来实现类似的东西.

var adder = {
  n: 0,
  addn: function(a) {
    return this.n + a;
  }
};

adder.n = 5;
adder.addn(2); // 7
Run Code Online (Sandbox Code Playgroud)


cas*_*nca 6

如果我正确理解了您的问题,您可以为您的匿名函数命名并通过以下方式访问函数对象的属性:

var addn = function func(a) {
  return func.n + a;
};

addn['n'] = 3;
addn(3); // returns 6
Run Code Online (Sandbox Code Playgroud)