【问题标题】:Object function scope对象功能范围
【发布时间】:2016-02-27 16:21:16
【问题描述】:

factory(n) 返回带有函数的对象。 func1 函数定义创建自己的作用域,并且此函数内部的 x 引用 x = n + ''。 但是func2是引用,作用域不对。

有没有办法从create 返回一个对象,所以它的函数是引用(不是单独的定义)?

实际上,我可以使用 func1 方法,而函数定义占用空间很小。如果它是一个复杂的函数,最好不要将此函数克隆到来自factory(n) 的每个对象中。 inner_func 可以不用this,它是简单的功能。我也想避免newthis

var factory = (function(){
  var x = '!';

  return function create(n){
    var x = n + '';
    return {
      func1: function(y){return inner_func(x, y); },
      /* vs */
      func2: inner_func_api
    }
  }

  function inner_func_api(y){ return inner_func(x, y); }

  function inner_func(a, b){ return a + b; }

}());

var f1 = factory(2);
var f2 = factory(3);

var f1_func1 = f1.func1(4);
var f2_func1 = f2.func1(5);

var f1_func2 = f1.func2(4);
var f2_func2 = f2.func2(5);

console.log(f1_func1, f2_func1); //24 35
console.log(f1_func2, f2_func2); //!4 !5

【问题讨论】:

  • 使用 new 和原型是这样做的内置方法。我知道克罗克福德不喜欢它。但这就是做你想做的事情的语言机制。您的 func2 方法很好,并且使用引用作为函数。
  • 我不完全确定你在问什么。您要么需要闭包来捕获状态,要么需要传递参数。根据您实际在做什么,您可能能够使用部分应用程序并避免 整个 重复函数,但您仍然需要通过闭包或参数获取所需的状态。正如 t3dodson 所说,“避免”newthis 有效地消除了 JS 的大部分 OOP 功能——放弃 JS 提供给你的东西的理由是什么?
  • 可能是太严格了。我想补充一下,this, prototype, bind, call 里面func1, func2, inner_func_api 可以。至于 OOP,我想尽量减少管理状态。你不觉得,没有thisnew 的代码看起来很漂亮:),而且更简单。正如我所说,解决方案可以完成工作;我只是想稍微改进一下,并认为我为此遗漏了一些东西。

标签: javascript scope closures


【解决方案1】:

可以return 语句中与对象初始化器分开定义该函数:

var factory = (function(){
  var x = '!';

  return function create(n){
    var x = n + '';

    function func1(y) {
      return inner_func(x, y);
    }

    return {
      func1: func1,
      /* vs */
      func2: inner_func_api
    }
  }

  function inner_func_api(y){ return inner_func(x, y); }

  function inner_func(a, b){ return a + b; }

}());

但是,这并没有什么实际的区别,而且无论该功能有多大或多么复杂。函数实例确实会占用空间,但函数的代码是常量(不可变)并且不需要是从同一段源代码创建的每个 Function 对象的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2015-09-25
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多