繁体   English   中英

javascript函数是对象吗?

[英]javascript functions are objects?

一段时间以来,我一直在为一个 Javascript 问题苦苦挣扎,但我无法在网上找到解释。 我想这是因为我没有输入正确的关键字,这也可能与我为什么为此苦苦挣扎有关。

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

> var x = {'n': 2};
> x['n']
2
> x['n'] = 3;
3

嗯,工作。 但仍然(函数也是对象):

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

> addn(3);
5
> addn['n'] = 3;
3
> addn(3);
5

这次我无法更改“n”。 有没有办法在保持功能风味的同时解决这个问题? 与完全面向对象相反。 我有一个相关的问题是如何维护函数的依赖关系以进行例如测试 - 再次没有面向对象? 当然,我正在寻找解决方案,但如果可能的话,我也想了解 Javascript 中的哪种机制让我陷入困境。

干杯,

标记

免责声明:通过提及 OO,我无意说任何反对 OO 的内容。 我也无意反对 VI 或 Emacs。 如果我以某种方式伤害了你的感情,请跳过这一点。

函数作用域中的私有变量和对象的属性是两个非常不同的东西。 该函数内部的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

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

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

addn['n'] = 3;
addn(3); // returns 6

对象属性和局部变量在很大程度上是不相关的:

  • var n声明了一个变量,该变量的作用域是它所在的函数(即它在该函数之外不可见(通过闭包除外))。

  • addn['n']addn添加了一个名为n的属性,相当于addn.n

首先,您不会通过执行以下操作来更改函数变量:

添加['n'] = 3;

您定义的函数没有任何名称(也称为“匿名函数”)。 您只是将该函数分配给名为addn的变量。 变量没有任何属性 - 它只是一个容器(除非变量引用数组)。 所以addn['n']什么都不返回。

正如用户casablanca指出的,您可以将您的函数命名func ,然后将其属性访问(和修改)为func.<propertyname>

由于 JavaScript 具有函数作用域,您可以使用函数来存储 n 的值,如下所示:

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

addn(3) // 5
addn(3) // 8

最好完全忘记 Javascript 领域中“对象”的传统 OO 概念,转而考虑闭包。 我强烈建议您阅读 jQuery 的创建者 John Resig 的本教程

每个函数都有一个scope ,基本上是在何处/如何调用函数。 当一个函数被调用时,它会创建一个新的函数执行上下文将它推送到调用堆栈上; 在该语言读取该行/语句之前,该上下文中不存在任何内容,直到调用该函数才会发生这种情况。

您所做的是为函数的 PROPERTY 赋值,而不是访问该范围内的变量n

不能从外部作用域访问内部作用域,因为外部作用域不存在内部作用域,但是可以从内部作用域访问外部作用域,因为外部作用域存在于内部作用域。

另外,这里有一点仅供参考。

JavaScript 是基于prototype的; 不是基于class的。 JavaScript 中的一切都是对象,甚至是函数。 阅读本文以了解更多原因(这是 Quora 上的一篇好文章) - https://www.quora.com/Why-is-function-an-object-in-Javascript

基本上,Javascript 中的一切都是一个对象。 如果你说

var a=3;
a['n']=4;

对 'a' 的引用仍然会返回 3,但 a 也有一个成员 'n',它的值是 4。所以当你说addn['n'] = 3你是在向 addn 添加一个新成员,而不影响函数以任何方式。

我强烈推荐阅读良好的 c 习惯如何鼓励不良的 javascript 习惯。 在描述您可能做错的所有事情时,这是对对象在 Javascript 中工作方式的一个很好的介绍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM