将属性添加到函数中

将属性添加到函数中

问题描述:

您可以将属性分配给函数,但这是个好主意吗? 在这个例子中,我表现出你不能创建属性里面的的功能,但你可以以外的它。将属性添加到函数中

问:是否将一个可疑问题视为JavaScript编程实践?

function a() { 
 
a.bad = 1 
 
} 
 
a.questionable = 2 
 

 
function d() { 
 
    console.log(a.bad) 
 
    console.log(a.questionable) 
 
} 
 
d()

对此问题予以JavaScript: Understanding the Weird Parts

+0

它不应该是'this.bad = 1'呢?由于'a'在函数范围 –

+1

^no中是未定义的,所以除非'a'是构造函数 – Damon

+1

在函数内部创建属性同样适用 - 您从来没有调用过'a()'来运行它。在调用'd()'之前,将'a();'添加到您的代码中,您将为'a.bad'获得'1'输出。 – freginold

在这个例子中,我显示你不能创建一个属性到函数中的函数,但你可以在它之外。

实际上并非如此。您可以在任何有引用的地方将属性添加到函数中。问题是你没有拨打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.fnjQuery.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 
 
)

+0

糟糕。对于那个很抱歉。 –

激发它的优良放在功能性。事实上,这正是ES6类的静态方法,这是static的唯一用法;考虑明确的语言支持。

class Foo { 
    static bar() {} 
} 

'bar' in Foo // true 
typeof Foo // 'function' 

在这个例子中,我展示你不能创建一个属性里面的函数的函数,但是你可以在外面了。

您可以在该函数内的某个函数上创建一个属性,但期望函数的主体在未调用的情况下运行是不合理的。

+0

糟糕。对于那个很抱歉。 –