从Javascript方法访问调用对象

时间:2017-02-01 06:57:34

标签: javascript this

在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?

4 个答案:

答案 0 :(得分:1)

  

与其他语言相比,函数this关键字在JavaScript中的行为略有不同。它在严格模式和非严格模式之间也有一些区别。在大多数情况下,this的值取决于函数的调用方式。它不能在执行期间通过赋值设置,并且每次调用函数时都可能不同。

要自己操纵this对象,可以使用JS方法callapply& 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(),然后将返回值分配给attthiswindow,因为您无法使用任何上下文调用foo()

稍后您致电A.foo();,因为A.foo()undefined而引发错误。

att: foo()更改为att: foo,以便您分配该功能而不是将其调用,并将A.foo()更改为A.att()

&#13;
&#13;
function foo() {
  console.log(this)
}

let A = {
  att: foo,
  att2: "bla"
}

A.att();
&#13;
&#13;
&#13;

答案 2 :(得分:-1)

我会说我不同意答案,因为这里的问题是如何从我调用函数的地方获取this(对象),实际上是对象A.我更喜欢绑定Object函数,将Object直接绑定到全局函数。请参阅下面的示例将A绑定为B的此对象。在这种情况下,我可以使用任意数量的对象执行此操作,而不必影响原始函数。

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:-1)

function foo() {
  console.log(this)
}

let A = {
  att: foo(),
  att2: "bla"
}

foo.call(A); //It will return Object A