javascript - 对象函数作用域

标签 javascript scope closures

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

最佳答案

可以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 对象的一部分。

关于javascript - 对象函数作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35672167/

相关文章:

javascript - 单击 ng-dialog 中的按钮不起作用

javascript - 输入类型中的 "Saving"值 = "hidden"Chrome 替代方案

javascript - 使用 jQuery 复制 Google 图像查看器

c++ - 复制回调?

swift - 为什么我们不能在闭包定义中使用实例成员?

javascript - 与 <noscript> 相反

python - 尝试更新 tkinter 类中的标签

Python - 列表变量的范围

grails - WithNewWindow() 在 Geb 中返回 MultipleCompilationErrorsException

python - 在 Python 中返回累​​加器的函数