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,但请注意,我从未直接调用作为参数给出的匿名函数,而只调用