您可以为函数指定属性,但这是个好主意吗? 在这个例子中,我表明你不能为函数里面的函数创建一个属性,但你可以在之外。
问:a.questionable被认为是一个好的JavaScript编程实践吗?
function a() {
a.bad = 1
}
a.questionable = 2
function d() {
console.log(a.bad)
console.log(a.questionable)
}
d()
答案 0 :(得分:3)
将属性放在函数上很好。实际上,这正是ES6类上的静态方法,这是static
的唯一用途;认为它是明确的语言支持。
class Foo {
static bar() {}
}
'bar' in Foo // true
typeof Foo // 'function'
在这个例子中,我表示你不能为函数内部的函数创建属性,但你可以在它之外。
您可以在该函数内的函数上创建一个属性,但是期望函数体在不调用它的情况下运行是不合理的。
答案 1 :(得分:3)
在此示例中,我显示您无法为函数内的函数创建属性,但您可以在其外部。
事实并非如此。您可以在任何有参考的函数的属性中添加属性。问题是您没有调用a()
,因此行a.bad = 1
从未有机会运行。
function a() {
a.bad = 1
}
a.questionable = 2
function d() {
console.log(a.bad)
console.log(a.questionable)
}
a()
d()

问:
a.questionable
被认为是一个好的JavaScript编程实践吗?
jQuery非常广泛地使用它(想想jQuery.fn
,jQuery.extend
等) - 所以不,我不认为它被认为是"坏"编程实践本身。事实上,在ES6将它们作为class
syntax的一部分引入之前,向构造函数添加属性是模仿静态字段和方法的唯一方法。
function Constructor() {
}
Constructor.staticMethod = function () {
return "I'm a static method!"
}
Constructor.staticProperty = "I'm a static property!"
console.log(
Constructor.staticMethod(),
Constructor.staticProperty
)