关闭替代方案

时间:2016-07-06 08:26:46

标签: javascript

我遇到很多情况,我发现自己需要做类似于以下的事情

attr

即。一个闭包,我的回调函数需要我之前定义的变量function main() { var x = "Something"; foo('do stuff', function bar(stuffResponse) { var y = x + stuffResponse; }); } 。这让我很烦恼,因为我不喜欢我的x函数依赖于自身之外的变量,但最重要的是因为我很多更喜欢像这样编写我的代码... < / p>

bar

但显然如果我这样做function main() { var x = "Something"; foo('do stuff', bar); } function bar(stuffResponse) { var y = x + stuffResponse; } 不知道bar是什么了。是否有一种干净的方式来实现后一种风格,同时保留前者的功能?

3 个答案:

答案 0 :(得分:3)

变量可以通过以下任何方式获得:

  1. 作为参数传递给函数。
  2. 在函数中声明。
  3. 全球宣布
  4. 可从封闭范围获取。
  5. 您必须决定要使哪些x可用。 4完全没有问题。 2不适用于此处。应避免使用3。根据具体情况,1是一个合理的选择。

答案 1 :(得分:1)

您可以使用内置的通话功能: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call并执行以下操作:

function main() {
  var x = "so clean";

  function foo(cb) {
    cb.call(null, x);
  }

  foo(bar);
}

function bar(something) {
  console.log(something);
}

答案 2 :(得分:0)

如评论中所述,您可以通过将变量绑定到回调来完成您要实现的目标。那将给你一个值的副本,而不是引用原始变量:

function main() {
    var x = "Something";

    foo('do stuff', function bar(x, stuffResponse) {
        var y = x + stuffResponse;
    }.bind(null, x));
}

您还可以绑定this而不是null。但是,由于您未使用this,因此它没有任何意义。