我可以调用具有其他功能范围的功能吗?

时间:2019-08-06 01:09:24

标签: javascript function

请参见以下代码:

function parent(child) {
  var a = 4;
  var b = 5;
  child();
}

parent(function() {
  console.log(a + b);
})

我可以理解的是:

  

未捕获的ReferenceError:未定义。

有什么我可以做的,只是更改parent函数,以便子函数中的console.log()可以访问ab以便可以引用这样吗?

我知道我可以将ab作为参数传递给child,但是我想知道是否可以通过注入父范围的方式调用子函数以便我不需要在子功能中列出参数。

我也查看了.call().apply().bind(),但似乎只有当我在两个{ {1}}和子功能。

1 个答案:

答案 0 :(得分:0)

您可以使用window(通过引用this)向其添加全局变量,但是至少可以这样说,这种方法不是很好:

function parent(child) {
  var a = 4;
  var b = 5;
  this.a = a;
  this.b = b;
  child();
}

parent(function() {
  console.log(a + b);
})

另一个丑陋的解决方案是使用eval,我也不推荐这样做:

function parent(child) {
  var a = 4;
  var b = 5;
  eval('var f = '+child);
  f();
}

parent(function() {
  console.log(a + b);
})


您最好通过上面提到的变量:

function parent(child) {
  var a = 4;
  var b = 5;
  child(a, b);
}

parent(function(a, b) {
  console.log(a + b);
})

或者,您可以将child函数包装到包装函数中(即使其成为一个闭包),该包装函数可以为a接受参数bchild()像这样使用:

function parent(child_wrapper) {
  var a = 4;
  var b = 5;
  var child = child_wrapper(a, b);
  child();
}

parent(function(a, b) { // wrapper function
  return function() { // original child function (untouched, just being returned by the wrapper function)
    console.log(a + b);
  }
})

相关问题