Javascript 理解函数自参考力学

Javascript 理解函数自参考力学,javascript,function,Javascript,Function,我(大概)遇到了这种情况:我试图声明func1()函数,并通过运行\u init()函数向其添加两个静态方法,该函数提供了一个带有属性的散列来附加到它,但没有意识到在\u init()之后它没有保持在当前范围内声明状态函数完成了它的工作。它只是临时定义的,并且在\u init()运行之后(据我所知)gc被重新定义。下面是代码示例: // // #_init // merge src{} into target{}, overwriting // var _init = (function (t

我(大概)遇到了这种情况:我试图声明
func1()
函数,并通过运行
\u init()
函数向其添加两个静态方法,该函数提供了一个带有属性的散列来附加到它,但没有意识到在
\u init()之后它没有保持在当前范围内声明状态
函数完成了它的工作。它只是临时定义的,并且在
\u init()
运行之后(据我所知)gc被重新定义。下面是代码示例:

//
// #_init
// merge src{} into target{}, overwriting
// 
var _init = (function (target, src) {

  var _ = this;

  if (_.isobj(target))
    _.keys(src).forEach(_.pass, {
      src    : src, 
      target : target
    });

  return target;

}).bind({

  isobj : (function (node) {
    return node === this(node);
  }).bind(Object), 

  keys  : (function (node) {
    return this.keys(this(node));
  }).bind(Object), 

  pass  : function (field) {
    this.target[field] = this.src[field];
  }

});
,我希望在这里“批量初始化”,同时添加静态方法:

_init(function func1 (e) {
  var _api = func1.pop(arguments);
  var node = this;
  // and stuff...
}, {
  pop: Function.prototype.call.bind(Array.prototype.pop), 
  // ...etc
});
稍后尝试引用时,我遇到错误:

x = func1();
// ReferenceError: func1 is not defined
// x = func1()
\u init()
的输出分配给
var func2
完成了这项工作,我可以引用和使用该函数。让我困惑的是,当
console.log()
-ing
func2
记录“func1()”时,尝试引用
func1
会直接引发引用错误:

//
// #func2
//
var func2 = _init(function func1 () {
  return func1.pop(arguments);
}, {
  pop: Function.prototype.call.bind(Array.prototype.pop)
});

console.log(typeof func2, func2, func2(1,2,3));
// function func1() 3

console.log(func1(1,2,3));
// ReferenceError: func1 is not defined
// console.log(func1(1,2,3));
//
有人能给我解释一下为什么没有创建
func1
引用,但是(奇怪的是)可以使用
func2
(它显然能够使用它…)

有人能向我解释为什么func1引用没有被创建,但是(奇怪的是)func2可以使用它(它显然能够使用它…?)

这就是工作的方式。它们的名称(
func1
)在函数体内部可用作标识符,但在函数体外部不可用。表达式的结果(将创建的函数传递给
\u init
,然后将其分配给
func2
)是另一回事,完全无关


我试图声明func1()函数并向其中添加几个静态方法

您不应该这样做,除非这些静态方法确实应该是公共的,而不仅仅是简单的辅助方法。使用显示XY模式(IEFE),只需在闭合范围内获取实用程序函数:

var _init = (function() {
  function isobj(node) {
    return node === Object(node);
  }
  function pass(field) {
    this.target[field] = this.src[field];
  }
  var keys = Object.keys;

  return function (target, src) {
    if (isobj(target))
      keys(src).forEach(_.pass, {
        src    : src, 
        target : target
      });
    return target;
  };
});
var func2 = (function() {
  var pop = Function.prototype.call.bind(Array.prototype.pop);

  return function func1 () {
    return pop(arguments);
  };
});

这里有太多的错误,不可能分辨出来。你应该在第一时间辞职,专注于更简单的构造,或者找到一个库来为你处理继承和诸如此类的事情。你能详细说明一下吗,什么错误,简单构造?这看起来是一种非常复杂的方式来做一些听起来不那么复杂的事情。弄清楚你想做什么,从简单的函数开始,并尽量使它尽可能简单,因为很难按照你传递函数和将整个对象绑定到一个生命中然后返回函数的方式,等等。“说不出来”意味着我不会详细说明。@adeneo:这只是加快速度的问题。。。根据我的经验,通过在函数作用域中填充数据来避免在函数作用域之外查找标识符可以提高执行速度。