在JavaScript中,对于在对象内定义的匿名函数,this
关键字引用对象本身。但是,当在对象范围之外定义函数时,this
引用窗口对象,例如:
function foo() {
console.log(this)
}
let A = {
att: foo(),
att2: "bla"
}
A.foo();

[编辑]:我在原始代码中犯了一个错误,我打算把这个函数称为A.att()(我有义务保持att:foo()。我的代码基本上如下:
function foo() {
console.log(this)
}
let A = {
att: foo(),
att2: "bla"
}
A.att();

此处的输出是对象窗口,而不是我想要访问的对象,即A。我无法更改A,那么如何从foo()访问A?
答案 0 :(得分:1)
与其他语言相比,函数
this
关键字在JavaScript中的行为略有不同。它在严格模式和非严格模式之间也有一些区别。在大多数情况下,this
的值取决于函数的调用方式。它不能在执行期间通过赋值设置,并且每次调用函数时都可能不同。
要自己操纵this
对象,可以使用JS方法call
,apply
& bind
。
让我们举例说明:
<强> Function.prototype.call()强>
详细信息:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind
function foo() {
console.log(this)
}
var A = {
att: foo,
att2: "bla"
}
foo.call(A);
<强> Function.prototype.apply的()强>
详细信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
function foo() {
console.log(this)
}
var A = {
att: foo,
att2: "bla"
}
foo.apply(A);
<强> Function.prototype.bind()强>
详细信息:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind
function foo() {
console.log(this)
}
var A = {
att: foo,
att2: "bla"
}
var x = foo.bind(A);
x();
答案 1 :(得分:0)
在JavaScript中,对于在对象内定义的匿名函数,
this
关键字引用对象本身。但是,当在对象范围之外定义函数时,this
引用窗口对象
没有。定义函数的地方是无关紧要的。调用函数的方式决定了this
的值。
这里的输出是对象Window,而不是我想要访问的对象,即A。
这是因为您正在调用foo()
,然后将返回值分配给att
。 this
为window
,因为您无法使用任何上下文调用foo()
。
稍后您致电A.foo();
,因为A.foo()
为undefined
而引发错误。
将att: foo()
更改为att: foo
,以便您分配该功能而不是将其调用,并将A.foo()
更改为A.att()
function foo() {
console.log(this)
}
let A = {
att: foo,
att2: "bla"
}
A.att();
&#13;
答案 2 :(得分:-1)
我会说我不同意答案,因为这里的问题是如何从我调用函数的地方获取this(对象),实际上是对象A.我更喜欢绑定Object函数,将Object直接绑定到全局函数。请参阅下面的示例将A绑定为B的此对象。在这种情况下,我可以使用任意数量的对象执行此操作,而不必影响原始函数。
function foo() {
console.log(this)
}
let A = {
att: foo,
att2: "From A"
}
let B = {
att: foo,
att2: "From B"
}
B.att = B.att.bind(A)
A.att();
B.att()
&#13;
答案 3 :(得分:-1)
function foo() {
console.log(this)
}
let A = {
att: foo(),
att2: "bla"
}
foo.call(A); //It will return Object A