Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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 - Fatal编程技术网

“失去”;这";传递成员时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时,这个未定义?如何在不过于冗长或存储过多的情况下恢

我有一个简单的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时,
这个
未定义?如何在不过于冗长或存储过多的情况下恢复该上下文

为什么我试着打电话给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);

因为当您将函数分配给新变量时,上下文会发生变化。你可以一直做
a.t()

或者,如果不需要传递函数,只需要调用一次,则可以使用:
var l=a.t;l、 电话(a)
关于原始询问者的代码,如果在原始
A
函数中定义了
A.t()
是否有效?这样函数就可以访问一个私有范围的变量()。@RobertRossmann您能演示一下吗?@eatonphil:
l.call(a)
将调用
l
,并将
This
设置为
a
@JeffNoel:Yes。这不是
这个
,而是肯定的。但是,它可能“保留了太多内容”。相关:。但绑定上下文实际上与作用域无关。