JavaScript函数中的"this"是什么?

4
我理解“this”是调用对象的引用。
我习惯在代码中看到像这样的“this”:
var Person = function() {
   this.name = "foo";
}

但是我看到了这些代码行:
示例1:
function helloWorld1() {
   this({ body: "Hello world!" })();
}

示例2:

我还看到了这段代码:

function helloWorld2() {
  this
    ({ body: "Hello, " })
    ({ body: "world!" })
    ();
}
  • 这里的"this"是什么意思?
  • 上面的例子中发生了什么?

1
第一个例子中,我猜你的意思是 this.name 而不是 self.name - Daniel Vassallo
1个回答

8

实际上,this 可以指代不同的东西,隐式地,它是根据你调用函数的方式设置的,例如:

obj.func();

func内部的this值将指向obj

new Func();

this 值将指向一个从 Func.prototype 继承的新创建的对象。

func();

this 值将引用全局对象。

同时,这个值也可以被 显式地 设置,例如使用 callapply 方法:

function foo () {
  alert(this);
}

foo.call("hello world");

你所发布的 helloWorld1 示例仅在 this 值引用返回另一个函数的函数时才能工作,因为如果您分析该行:

this({ body: "Hello world!" })();

您可以注意到this需要是一个函数,因为您正在调用它并将对象传递给它。我们知道返回值也需要是一个函数,因为最后的括号是另一个函数调用。

例如:

var fn = function(o){
  return function () {
    alert(o.body);
   }
};
helloWorld1.call(fn);  // or the equivalent

fn.method = helloWorld1;
fn.method();

编辑: 要使您发布的helloWorld2示例工作,this值需要是一个具有模式的函数,允许我们链接多个函数调用,每次返回相同的函数,直到该函数不带参数被调用,例如:

var fn = (function(){
  var msg = '';
  return function inner (o) {
    if (o) { // called with an argument?
      msg += o.body;
    } else { // no, show the message
      alert(msg);
    }
    return inner; // return a reference to itself
  };
})();

function helloWorld2() {
  this
  ({ body: "Hello, " })
  ({ body: "my " })
  ({ body: "world!" })
  ();
}
helloWorld2.call(fn); // "Hello my world!"

@ajsie:你能否提供一个函数被调用的例子?正如你所看到的,如果我们明确地设置了值,this 的值几乎可以引用任何东西。 - Christian C. Salvadó
实际上我不知道。我正在尝试学习一个带有这些构造的 js 框架:http://www.flickr.com/photos/tr4nslator/sets/72157623883700702/show/. 看一下幻灯片,它非常有趣 =) - never_had_a_name
哇,你太棒了!这帮我理解了很多!你有没有推荐一本好的 JavaScript 书籍来解释这些内容?因为我读过的 JavaScript 书籍只是解释了一些简单的 DOM 操作和一些花哨的效果。 - never_had_a_name
1
@ajsie:谢谢!我很高兴我的回答对你有帮助,我可以向你推荐一些关于这种函数式模式的学习资源:Learning Advanced JavaScriptEloquent JavaScript,至于书籍方面,我总是推荐 JavaScript: The Definitive Guide。此外,我之前发布过一个列表,列出了一些通用的好资源。 - Christian C. Salvadó

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接