带括号的函数是什么意思?

3
有人知道 test[name] 是什么意思吗?
function test(value){
  copy(value||{},this);
}
test[name] = function(){
    return "test"
}

3
“test[name]” 是一个数组元素,在这种情况下被赋予了一个函数。 - Jake Aitchison
5
@milkshake 数组元素?什么意思? - Esailija
@Esailija 在一个数组中,它看起来像它的键将由一个变量决定。 - Jake Aitchison
8
我没有看到任何数组,我看到一个方法分配给一个函数对象。 - Esailija
6
JavaScript中几乎所有的东西都是对象,包括数组。这并不意味着每个对象都是一个数组(问题中的对象就不是一个数组)。 - JJJ
显示剩余3条评论
7个回答

6
这个最好用一个例子来解释:
var name = "foo";
test[name] = function(){
    return "test"
};

这将向对象test添加一个名为“foo”的属性,其值是一个函数。在这种情况下,对象test实际上是一个函数并不重要,你可以像在JavaScript中的任何其他对象一样给函数分配属性。
你可以使用以下任何一种方法调用此函数:
  • test[name]()
  • test["foo"]()
  • test.foo()
请注意,如果将变量name分配给其他内容(例如name ='bar'),则test[name]()将无法正常工作。

由于名称是 test 的一个属性,但当我使用 console.log(test) 时,它只显示该函数。它应该是一个对象吗? - user1598686
函数是对象,但它们在 console.log() 中的表示方式取决于如何实现 toString() 函数。要将函数打印为对象,可以使用 console.log(Object.prototype.toString.apply(test))编辑: 实际上这取决于浏览器,看起来 Chrome 和 Firefox 不会在对象的 console.log() 中使用 toString(),不太确定如何在这种情况下记录函数像对象一样。 - Andrew Clark

1
所有Javascript中的函数都是对象。这为test函数对象添加了一个属性,该属性的值是一个匿名函数。
例如:
function test(){
  return "foo";
}

// test is a function, so it is also an object and 
// it can have properties assigned to it
test.x = function(){
   return "bar";
};

test();   // "foo"
test.x(); // "bar"

当然,就像任何对象一样,您也可以使用括号表示法

var name = 'hello';
test[name] = function(){
  return "HELLO!";
};

test.hello(); // "HELLO!"

1
Javascript有两种访问对象的符号表示法,点符号(obj.property)和方括号符号(object[property])。更多信息请参见MDNtest[name] = function () {}将一个匿名函数赋值给test对象上的name属性(它本身是一个函数)。在这种情况下(如注释中所述),变量name被用于访问该属性。
这可能一开始看起来有点奇怪,但需要记住,在javascript中,函数是对象。

3
name 不是一个字符串。 - xanatos
name 是一个变量,不是一个字符串。 - gen_Eric

0

当你有一个具有定义属性的JavaScript对象时,可以使用点符号obj.property或方括号符号obj[property]访问属性。 属性也可以是一个函数,因此如果你有一个对象:

var test = { foo : function(arg){ console.log(arg) }, bar : 'hello' };

你可以通过test['foo']('bar')调用test.foo('bar')。 这在迭代或你不事先知道属性名称时特别有用。例如:

var fun = 'foo';
test[fun]('hello world');

当然,你需要进行适当的检查,例如:

if ('function'==typeof test['foo']){ test['foo']('bar'); }

另外请注意,你可以像这样实时检查:

test[ fun || 'foo']('hello');


0

摘自Mozilla页面

我们可以将对象看作是一个关联数组(也称为映射、字典、哈希表、查找表)。该数组中的键是对象成员的名称。

访问对象成员有两种方式:点表示法和方括号表示法(也称下标运算符)。

因此,

test[name] = function (

意思是:如果一切正常,将会有两个对象:testname(我们知道至少有一个test对象存在,因为在前一行中定义了它:function test(value)

获取test对象(如果没有test对象,将会出现错误)。然后访问从name对象计算出的键/值对,并在其中放置一个函数。

那么,如何从name对象计算键呢?之前的页面告诉我们:

属性名必须是字符串。这意味着非字符串对象不能用作对象中的键。任何非字符串对象(包括数字)都会通过toString方法转换为字符串。

请注意,描述有点错误... test[null] == test["null"]test[undefined] == test["undefined"],因此也许事实是在底层执行了类似于 String(key).valueOf() 的操作(String 函数将把 null 转换为 "null",并将 undefined 转换为 "undefined")。
一些例子(其中 => 表示“等价于,具有这些值”)。
var name = 'foo';
test[name] => test['foo']

var name = 123;
test[name] => test['123']

var name = 123.3;
test[name] => test['123.3']

var name = new Date();
test[name] => test['Wed Aug 14 2013 17:35:35 GMT+0200 (...)']

var name = null;
test[name] => test['null']

var name = undefined;
test[name] => test['undefined']

var name = [];
test[name] => test['']

var name = [1,2,3];
test[name] => test['1,2,3']

var name = {};
test[name] => test['object Object']

等等……


0
在JavaScript中,函数是对象。它们有属性。test[name]将一个名为name变量所持有的属性设置为一个函数。

-1

方括号是在JavaScript对象中通过键引用属性的方式。


1
我想这在技术上是正确的,但我怀疑它对OP来说并没有澄清问题。 - JJJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接