函数引用其属性是否合法 javascript (ECMAScript)?

Is it legal javascript (ECMAScript) for a function to reference its attributes?

函数引用其属性是否合法 javascript (ECMAScript-5)?

var baz = function(callback) {
  return callback();
};

var foo = function() {
  return foo.bar;
}

foo.bar = 1;

foo(); // 1?

baz(foo);  // 1?

编辑:您能否向我介绍 ECMA 规范中声明这是合法的部分?

是的,一个函数就是一个对象,对象有属性并且它们可以访问它们的属性。

请记住,在 JS 函数中首先是 class 公民,它们可以拥有自己的属性。还请记住,属性 评估发生在 调用函数时 而不是在创建函数时,因此 属性 可以稍后添加。

你可以在这里看到:

var foo = function() {
  return foo.bar;
}

foo.bar = 1;

alert(foo()); // 1?

是的。

人们在使用对象时经常 运行 遇到这个问题,这些对象在初始化期间被评估并且在尝试引用它们的属性时不存在。这不是函数的问题,因为 属性 在稍后调用该函数之前不会被访问。

例如:

let foo = {
  bar: 1,
  baz: foo.bar + 1
};

失败,因为尚未将对象分配给 foo,因此 foo.bar 未定义。

对于函数,这不是问题,因为 foo 是对函数的引用,并且 bar 在函数被 调用之前不会被访问 :

function foo() {
  return foo.bar + 1;
}

foo.bar = 1;

您可以使用更好的模式,例如:

var baz = function() {
  var myVal = 0;
  return function() {
    //body
  }
}()

这样你在闭包中就有了一种备忘录变量,它会为你保存值

函数是对象,所以当然,它们可以拥有属性并访问它们。请注意,函数体无法访问这些属性。

注意像这样的代码需要函数体知道它的名字:

function foo() {
   return foo.bar;
}

.. 但你可以利用 arguments 属性 删除 redundancy/dependency:

function foo() {
  return arguments.callee.bar;
}
foo.bar = 1;
foo();  // 1