【问题标题】:JavaScript- this valueJavaScript- 这个值
【发布时间】:2013-06-11 06:17:29
【问题描述】:

我看到了一些code like this from jqplot library

$.jqplot.Dragable = function(options) {
    // a bunch of code here.
    $.extend(true, this, options);
};

这是向库中添加新插件的例程。

this$.extend(true, this, options) 中指的是什么?是函数本身还是窗口,还是调用时才会指定?

谢谢!

更新:

这个问题是一个普遍的问题,因为我不明白 js 中的 this 值。经过一番研究,显然:
1.如果使用func()调用,则this将是windowundefined(严格模式)
2. 如果像 foo.funct() 那样调用,this 指的是 foo。

至于这个特定的 jqplot 库,当它被调用时,它实际上是在 $.jqplot 上调用的,其中 jqplot 被添加到 jquery 中。所以this应该参考$.jqplot

【问题讨论】:

  • 这里看起来像是Dragable的一个实例
  • jqplot 库在调用扩展函数之前选择将其设置为什么。在 JS 中不一定是自动的。
  • @ArunPJohny 我对 js oop 很陌生...你是说 Dragable 是构造函数吗?为什么?还是js中的所有函数都可以是构造函数?
  • @Barmar 如果这样调用 $.jqplot.Dragable(optionObj),那么 this == $.jqplot.Dragable?
  • 你可以试试console.log(this),它应该会告诉你它是什么...

标签: javascript this


【解决方案1】:

在您的示例中,$.jqplot.Dragable 是一个构造函数。 this指的是当

时创建的对象
new $.jqplot.Dragable(options)

被调用。至于$.extend,它只是将options中的每个方法和属性复制到this上。

但没关系。首先你应该了解this 是什么。之后,您可以阅读我在 aswer 底部发布的链接,了解 JavaScript 中的构造函数和 OOP。

在 javascript 中,this 指的是方法或函数的上下文。 this 的值可以是三样东西。

全局上下文

当简单地通过名称或直接变量引用(不是对象属性)执行函数时,this 指向全局范围。在浏览器中,这是window 对象。

请注意,在严格模式下 thisundefined

function setFoo(val) {
    this.foo = val;
}

上面我们有一个函数setFoo。这个函数只取一个值并将其设置为this。让我们执行函数来看看会发生什么......

setFoo(10);

在这种情况下,this 指的是全局范围。因此,window.foofoo 应该等于 10。

window.foo == 10 //true
foo == 10 //true

对象上下文

当函数作为对象的属性存储时,它被称为方法。当一个方法被执行时,this 成为该方法附加到的对象。这允许该方法修改和使用对象上的数据。

现在让我们将 setFoo 附加到一个对象上。

var myObject = {};
myObject.setFoo = setFoo;

如果我们现在执行 myObject 将有一个名为 foo 的新属性,它将等于我们传递给 myObject.setFoo 的任何内容。

myObject.setFoo(34);

myObject.foo 应该等于 34,因为 this 指的是对象 myObject

myObject.foo == 34; //true

调用上下文

this 可以设置的最后一种方法是使用 Function 原型的方法。这意味着 JavaScript 中的所有函数和方法都有这些 to 方法。它们是callapply。这些函数允许程序员在执行函数或方法时设置自定义上下文。两者几乎相同,只是 apply 将数组作为其第二个参数。数组中的每一项都按顺序作为参数传递给函数/方法。

称呼
var x = {};
setFoo.call(x, 20);
x.foo == 20; // true
申请
var x = {};
var args = [20];
setFoo.apply(x, args);
x.foo == 20; // true

您应该阅读 MDN 上的 this 文章。它将帮助您更好地理解何时使用它,以及为什么它是函数范围的重要部分。

MDN - this

您还应该阅读,因为this 的主要目的是在 JavaScript 中启用 OOP(面向对象编程)。

MDN - Inheritance and the prototype chain

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-07-20
  • 2012-03-13
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2011-08-23
相关资源
最近更新 更多