如何在作为参数传递的函数中使用范围内变量

时间:2018-02-09 00:10:55

标签: javascript scope

这可能是一个基本问题,我知道这里有一些类似的问题,但我仍然没有找到答案。请考虑以下代码:

function Outer(inner2) {
  var x = 5;
  this.inner1 = function() {return (x);}
  this.inner2 = inner2.bind(this);
}
var outer = new Outer(function() {return (x);});
alert(outer.inner1()); // works
alert(outer.inner2()); // does not work

如果我要用this.x = 5;替换第二行,第二个警报就可以了。所以我想问题是xvar一起声明时不属于this,因此bind无效。

有没有办法在不使用this.x的情况下完成这项工作?

3 个答案:

答案 0 :(得分:1)

  

有没有办法在不使用this.x的情况下完成这项工作?

No

顺便说一句,你可能甚至不需要使用bind,当构造函数和方法都使用inner2时,只需调用this.x作为对象的方法就足够了。

如果您不想让x成为对象的属性,但将其保留为局部变量,通常的策略是将其作为参数传递给回调,而不是尝试以某种方式隐含地使其在其范围内可用:

function Outer(callback) {
  var x = 5;
  this.inner1 = function() { return x; };
  this.inner2 = function() { return callback(x); };
//                                          ^^^
}
var outer = new Outer(function(y) { return y; });
//                             ^           ^
alert(outer.inner1()); // works
alert(outer.inner2()); // works

答案 1 :(得分:1)

我认为你需要澄清这个词是什么"这个"指的是。

"这"是指向函数"外部。"

使用" new"调用构造函数时关键字,发生了一些事情。

  1. 构造函数返回一个对象。
  2. " this"变量已更改,因此它被设置为指向返回的对象。
  3. (另外,返回的对象的。 proto 设置为构造函数的.prototype,但这一步与此无关。)
  4. 因此,您将回调函数绑定到要返回的对象来自构造函数,构造函数本身。

    因此,回调函数绑定到外部(使用小写),而不是外部(使用大写)。

    此外,绑定时,您没有绑定到函数的范围。 X未分配给任何属性。我认为你只能绑定到一个对象并使用this.a等访问它的属性。

    第一个函数中的x有效,因为它的值是在函数范围内赋值的。

答案 2 :(得分:0)

我发现了一个虽然难看的解决方案:

function Outer(inner2) {
  var x = 5;
  this.inner1 = function() {return (x);}
  eval('this.inner2 = ' + inner2.toString());
}

这有效并且显示了我的观点:参数inner2只是this.inner2应该是什么样子的处方;它永远不会被自己调用。

请告诉我,如果你有一个比这更简洁的解决方案。