为什么`this`在这里引用`o`(o.method)()而不是全局对象

时间:2016-10-31 18:31:57

标签: javascript

假设我有一个对象:

lapply

我在期待这个

Total = x$Total / toDivide[as.character(x$Date)]

返回var o = { prop: 3, method: function() {return this.prop} } ,但返回(o.method)() ,表示undefined3内设置为this。为什么会这样?如果单独评估o,它将评估为独立函数,因此我希望method引用全局对象。例如,为什么存在差异:

(o.method)

我知道this将使用(o.method)() vs (o.method || true)() 作为上下文,问题主要是关于首先像o.method()那样访问函数然后调用它。 / p>

1 个答案:

答案 0 :(得分:2)

这就是JavaScript的规则如何运作。除非你做一些扭曲,this通常表示在调用它之前访问方法时.之前的事情。在这种情况下,即o

以下陈述相同:

(o.method)();
o.method();
o.method.call(o);
o["method"]();

但是,如果你把这个方法放在别的东西上,它就会理解它所涉及的东西的含义:

var p = {prop: 42, method: o.method};
p.method(); // returns 42

var method = o.method;
var prop = 13;
method(); // returns 13

注意:随着JavaScript的发展远远超过最初的设计,人们意识到这可能不是this最直观的工作方式,所以在ES6中,如果你使用"Arrow Functions"(又名Lambda函数)won't rebind this