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

时间:2015-06-26 16:29:08

标签: javascript ecmascript-5

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

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

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

foo.bar = 1;

foo(); // 1?

baz(foo);  // 1?

编辑:你能否引用我的ECMA规范声明这是合法的部分?

4 个答案:

答案 0 :(得分:2)

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

请记住,在JS函数中是一等公民,他们可以拥有自己的属性。还要记住,当调用函数时,属性评估会发生,而不是在创建它时,属性可以在以后添加。

你可以在这里看到:



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

foo.bar = 1;

alert(foo()); // 1?




答案 1 :(得分:2)

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

例如:

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

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

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

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

foo.bar = 1;

答案 2 :(得分:1)

您可以使用更好的模式,如下所示:

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

这样你在闭包内有一种备忘录变量可以为你保留值

答案 3 :(得分:0)

函数是对象,所以当然,它们可以拥有属性并访问它们。请注意,函数体对这些属性没有神奇的访问权限。

请注意,这样的代码要求函数体知道其名称:

function foo() {
   return foo.bar;
}

..但您可以利用arguments属性删除冗余/依赖项:

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