【问题标题】:declare function properties inside在里面声明函数属性
【发布时间】:2015-07-14 16:46:09
【问题描述】:

我知道我们可以设置如下函数属性

function f(){}
f['a']=1;//setting function property from outside
alert(f.a)//alert 1

但是是否可以如下设置函数的属性,或者是否有任何其他类似的方式在函数内部声明属性,而不是从外部声明?

function f() {
a: 1
}

alert(f.a);  //get 1 as output


编辑:
寻找一些不使用从函数构造函数创建任何对象或使用原型的方法

【问题讨论】:

  • 是的,我的意思是
  • 是的,您当然可以从函数内部将属性分配给函数对象。在所有函数中,arguments.callee 指的是封闭函数,但您确实应该将使用这种交互的函数命名为不推荐使用的被调用者。
  • @dandavis: "in all functions, arguments.callee" 并非所有,callee 在严格模式下不存在(实际上它不应该存在于第一名)。如您所说,使用名称,然后在函数中使用名称(如果需要):function f() { f.a = 1; }。但我确定 OP 不希望仅在调用时才定义它(并在每次调用时重复重新定义)。
  • 据我所知 arguments.callee 用于递归调用匿名函数
  • @Flake:只有当你有一个非常好的理由需要匿名的时候(因为 IE8 的消亡,我想不出一个,因为this bug 不再是借口)。而且不是严格模式,因为callee 不存在。

标签: javascript function properties scope


【解决方案1】:

不,没有。函数内部只有主体,即调用函数时执行的代码。函数文字/声明不是对象文字,即使两者都使用花括号。

如果您正在寻找一种比赋值更具声明性的方式来将静态属性放在函数上,请使用某种extend 功能:

var f = Object.assign(function f() {}, {
    a: 1
});

(所有_.extend$.extendObject.assign 都可以用于此目的 - 否则只需使用f.a =

【讨论】:

  • 所以设置属性的唯一方法是从外部?
  • @Flake:您可以从内部执行此操作 (f.a = 1),但它只会在您第一次调用该函数时生效,我猜这不是您想要的.. .
  • 函数只是一个对象。运行的代码可以调整它。该代码可以在函数内部或外部。
  • @Flake:函数是对象,但函数声明不是对象声明。不同的语义。同样,您也不能将a 属性分配给具有数组声明的数组,即使数组是对象。 Object.assign 这是您最接近以声明方式执行此操作的方式。
  • 请注意,截至 2015 年 7 月,Object.assign 尚未在主流浏览器中广泛实现。它是即将发布的 ECMAScript 2015 标准(以前称为 ES6)的一部分。
【解决方案2】:

这样做的唯一方法是使用 new 关键字调用函数:

var f = function() {
    this.a = 4;
}
var test = new f();
alert(test.a); // 4

我已经在这个 jsfiddle 上发布了更多测试:

http://jsfiddle.net/j4svr90x/2/

【讨论】:

  • 根本没有在函数上设置属性。 (不是我的 dv,虽然我确实拿到了它然后决定不这样做。)
  • @T.J.Crowder 是绝对正确的。严格来说,这会在从函数调用实例化的对象上设置一个属性。