Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在作为参数传递的函数中使用范围内变量_Javascript_Scope - Fatal编程技术网

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

Javascript 如何在作为参数传递的函数中使用范围内变量,javascript,scope,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(o

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

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,第二个警报将起作用。因此,我想问题在于,当使用
var
声明时,
x
不是
的一部分,因此
bind
将无效


有没有办法不使用
this.x
就可以实现这一点呢?

我找到了一个尽管很难看的解决方案:

function Outer(inner2) {
  var x = 5;
  this.inner1 = function() {return (x);}
  eval('this.inner2 = ' + inner2.toString());
}
这就说明了我的观点:参数
inner2
仅仅是
这个的一个处方;它从未被调用过


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

我找到了一个尽管丑陋的解决方案:

function Outer(inner2) {
  var x = 5;
  this.inner1 = function() {return (x);}
  eval('this.inner2 = ' + inner2.toString());
}
这就说明了我的观点:参数
inner2
仅仅是
这个的一个处方;它从未被调用过

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

有没有办法不使用
this.x
就可以实现这一点

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

如果不想将
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
有没有办法不使用
this.x
就可以实现这一点

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

如果不想将
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

我想你需要澄清“这”一词指的是什么

“this”未指向函数“Outer”

当您使用“new”关键字调用构造函数时,会发生一些事情

  • 构造函数返回一个对象
  • 更改“this”变量,使其设置为指向返回的对象
  • (此外,返回对象的.proto被设置为构造函数的.prototype,但该步骤在这里不相关)
  • 因此,您将回调函数绑定到从构造函数返回的对象,而不是构造函数本身

    因此,回调函数绑定到outer(小写),而不是outer(大写)

    此外,当您绑定时,您没有绑定到函数的作用域。X未指定给任何属性。我认为您只能绑定到一个对象并使用这个.a等访问它的属性


    第一个函数中的x起作用,因为它的值是在函数的范围内赋值的

    我认为您需要澄清“this”一词指的是什么

    “this”未指向函数“Outer”

    当您使用“new”关键字调用构造函数时,会发生一些事情

  • 构造函数返回一个对象
  • 更改“this”变量,使其设置为指向返回的对象
  • (此外,返回对象的.proto被设置为构造函数的.prototype,但该步骤在这里不相关)
  • 因此,您将回调函数绑定到从构造函数返回的对象,而不是构造函数本身

    因此,回调函数绑定到outer(小写),而不是outer(大写)

    此外,当您绑定时,您没有绑定到函数的作用域。X未指定给任何属性。我认为您只能绑定到一个对象并使用这个.a等访问它的属性


    第一个函数中的x起作用,因为它的值是在函数的范围内赋值的

    使用var声明时的
    x不属于此项
    -正确。您不能。JavaScript无法知道您在构造函数内部引用的是局部变量,而在构造函数外部引用的是局部变量,除非您将其附加到
    this
    或以某种方式将其取出。如果您不想使用
    this.x
    公开局部变量,您可能希望将其作为参数传递给inner2方法:
    var outer=new outer(函数(x){return(x);});
    this.inner2=inner2.bind(this,x)
    @Li357在声明时为True,但请注意,我从不直接调用作为参数给出的匿名函数,而只调用
    outer.inner2()
    。因此,编译器可以推断上下文。@Flo Schield Bobby,但随后我不得不更改匿名函数的签名(添加参数)。此外,在现实中,有很多变量,例如
    x
    ,我不想传递它们中的每一个…
    x当用var声明时不是这个
    的一部分-正确。你不能。JavaScript无法知道你在构造函数内部引用了一个局部变量,而在构造函数外部引用了它,除非你将它附加到
    this
    如果不想用
    this.x
    公开局部变量,可能需要将其作为参数传递给inner2方法:
    var outer=new outer(function(x){return(x);})
    this.inner2=inner2.bind(this,x)
    @Li357在声明时为True,但请注意,我从未直接调用作为参数给出的匿名函数,而只调用