大家好,我是咖啡新手,所以对此我感到困惑。我正在跟踪一本书“ https://www.montecassino.org/images/data/attachments/0000/0014/CoffeeScript.pdf”,其中有一个如下代码示例
setName = (name) ->
@name = name
console.log(@name)
console.log(name)
cat = {}
cat.setName = setName
cat.setName "Manu"
console.log(cat.name)
pig = {}
setName.apply pig, ['Babe']
console.log(pig.name)
在上面的代码中,我不了解发生了什么。有一个为对象分配名称的功能。但是cat.setName = setName和setName.apply猪['Babe']的目的和含义是什么。这些行的含义相同,那么它们之间的区别是什么。很抱歉,我想问一个愚蠢的问题,但我完全感到困惑。任何帮助,将不胜感激。谢谢
最佳答案
两个片段(一个关于cat
和一个关于pig
)都在完成同一件事。他们正在为两个不同的对象调用setName
函数。区别在于,在cat
示例中,setName
函数成为cat
对象的一部分,而在pig
示例中,setName
函数应用于pig
,但实际上并没有成为pig
对象的一部分。
可能更清楚地了解是否将其分解成几部分,并说明每部分正在做什么。
第一部分定义了一个函数,由setName
引用:
setName = (name) ->
@name = name
console.log(@name)
console.log(name)
如您所见,它采用单个参数
name
。如果您不熟悉CoffeeScript,则@name = name
可能会使您感到困惑。 CoffeeScript中的@
符号与JavaScript中的this
等效。在JS中,它是this.name
,但是在CS中,快捷方式是@name
。调用setName
函数时,@
(或this
)将引用从中调用setName
函数的上下文。cat = {}
cat.setName = setName
cat.setName "Manu"
console.log(cat.name)
在上面的块中,首先创建一个名为
cat
的空对象。最初没有功能或属性。然后,将setName
函数添加到上面定义的函数中。可以这样写:
cat = {}
cat.setName = (name) ->
@name = name
console.log(@name)
console.log(name)
但是由于已经定义了
setName
函数,因此我们可以简单地将cat.setName
设置为它。调用
cat.setName "Manu"
时(或者写为cat.setName("Manu")
,CoffeeScript中的括号是可选的),@
中的setName
指的是setName
所属的对象。 setName
(适当地)在name
对象上设置一个名为cat
的属性。如果您要访问console.log(cat)
,则会看到以下内容:{ setName: [Function], name: 'Manu' }
我们使用了一个名为
cat
的空对象,然后为其提供了一个名为setName
的函数,然后为其命名为setName
,该函数为其设置了一个属性:name
。pig
示例具有相同的结果,但是语法略有不同:pig = {}
setName.apply pig, ['Babe']
console.log(pig.name)
在此示例中,我们在
apply
上调用setName
函数(该函数本身)。调用setName.apply pig, ['Babe']
会将函数setName
应用于带有数组参数的对象pig
。通过将pig
作为第一个参数传递给apply
,我们实际上是在告诉apply
:在setName
内部,每当您看到@
时,我们实际上是在谈论pig
。apply
的第二个参数是调用setName
时要使用的参数数组。此数组中只有一个元素,该元素与setName
接受的参数数量相匹配。 ['Babe']
是仅具有一个参数:'Babe'
的参数数组。此示例与
cat
示例之间的重要区别在于,我们没有将setName
纳入pig
对象的一部分。实际上,console.log(pig)
会产生{ name: 'Babe' }
看到?没有
setName
功能。我们仅将该函数应用于pig
对象。您会在猫的示例中注意到行cat.setName = setName
-我们没有为pig
进行此操作。您可以参阅Mozilla的
apply
JS函数文档以获取更多背景信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fapply值得一提的是,我很少看到在生产CoffeeScript代码中使用
apply
的示例。如果您真的很想了解这一点,那么值得继续前进,以后再去回顾它。