“失去”;这";传递成员时JavaScript中的上下文
我有一个简单的JSFiddle来演示我的问题 我有以下JavaScript代码:“失去”;这";传递成员时JavaScript中的上下文,javascript,Javascript,我有一个简单的JSFiddle来演示我的问题 我有以下JavaScript代码: var b = document.getElementById("b"); function A() { this.f = "1"; } A.prototype.t = function() { b.innerHTML = this.f; }; var a = new A(); var l = a.t; l(); 为什么当我尝试调用a.t时,这个未定义?如何在不过于冗长或存储过多的情况下恢
var b = document.getElementById("b");
function A() {
this.f = "1";
}
A.prototype.t = function() {
b.innerHTML = this.f;
};
var a = new A();
var l = a.t;
l();
为什么当我尝试调用a.t时,这个
未定义?如何在不过于冗长或存储过多的情况下恢复该上下文
为什么我试着打电话给a.t.时,这是未定义的
因为在JavaScript中,这个
主要是通过调用函数的方式来设置的,而不是定义函数的位置a.t()
在调用中将this
设置为a
,但l()
将this
设置为未定义的
(在严格模式下)或全局对象(在松散模式下)
更多(在我的博客上):
函数#bind
)或ES6的“arrow”函数(从定义它们的上下文中获取它们的此
)
如何在不过于冗长或存储过多的情况下恢复该上下文
这通常是一个很好的答案:
var l = a.t.bind(a);
l();
它返回一个新函数,该函数在调用时调用原始函数,并将this
设置为您给出的第一个参数bind
。(您还可以绑定其他参数。)这是一个ES5函数,但是如果您需要支持非常旧的浏览器,您可以轻松地填充它
如果您只需要使用特定的
值调用l
,而不是总是让它使用该值,就像您可以使用函数一样,调用或函数应用:
l.call(this, 'a', 'b', 'c'); // Calls `l` with `this` set to `a` and args 'a', 'b', and 'c'
l.apply(this, ['a', 'b', 'c']); // Calls `l` with `this` set to `a` and args 'a', 'b', and 'c' -- note they're specified in an array
为什么我试着打电话给a.t.时,这是未定义的
因为在JavaScript中,这个
主要是通过调用函数的方式来设置的,而不是定义函数的位置a.t()
在调用中将this
设置为a
,但l()
将this
设置为未定义的
(在严格模式下)或全局对象(在松散模式下)
更多(在我的博客上):
唯一的例外是“绑定”函数(如函数#bind
)或ES6的“arrow”函数(从定义它们的上下文中获取它们的此
)
如何在不过于冗长或存储过多的情况下恢复该上下文
这通常是一个很好的答案:
var l = a.t.bind(a);
l();
它返回一个新函数,该函数在调用时调用原始函数,并将this
设置为您给出的第一个参数bind
。(您还可以绑定其他参数。)这是一个ES5函数,但是如果您需要支持非常旧的浏览器,您可以轻松地填充它
如果您只需要使用特定的值调用l
,而不是总是让它使用该值,就像您可以使用函数一样,调用或函数应用:
l.call(this, 'a', 'b', 'c'); // Calls `l` with `this` set to `a` and args 'a', 'b', and 'c'
l.apply(this, ['a', 'b', 'c']); // Calls `l` with `this` set to `a` and args 'a', 'b', and 'c' -- note they're specified in an array
JavaScript是功能范围的
要执行具有正确值的函数,需要将其绑定到正确的对象。比如说,
var l= a.t.bind(a);
JavaScript是功能范围的
要执行具有正确值的函数,需要将其绑定到正确的对象。比如说,
var l= a.t.bind(a);
因为当您将函数分配给新变量时,上下文会发生变化。你可以一直做a.t()代码>,因为将函数分配给新变量时,上下文会发生变化。你可以一直做a.t()
或者,如果不需要传递函数,只需要调用一次,则可以使用:var l=a.t;l、 电话(a)
关于原始询问者的代码,如果在原始A
函数中定义了A.t()
是否有效?这样函数就可以访问一个私有范围的变量()。@RobertRossmann您能演示一下吗?@eatonphil:l.call(a)
将调用l
,并将This
设置为a
@JeffNoel:Yes。这不是这个
,而是肯定的。但是,如果函数不需要传递,只需要调用一次,则可以使用:var l=a.t;l、 电话(a)
关于原始询问者的代码,如果在原始A
函数中定义了A.t()
是否有效?这样函数就可以访问一个私有范围的变量()。@RobertRossmann您能演示一下吗?@eatonphil:l.call(a)
将调用l
,并将This
设置为a
@JeffNoel:Yes。这不是这个
,而是肯定的。但是,它可能“保留了太多内容”。相关:。相关:。但绑定上下文实际上与作用域无关。但绑定上下文实际上与作用域无关。