0

有人可以解释thisJavascript 中的关键字吗?最好用简单的英语,不要引用在线资源或教科书。我很确定我已经通读了那些。我还没有完全掌握这个概念。

我知道这this可能有几种不同的含义,具体取决于它的使用方式和时间。

例如,我读到它在某些情况下可以引用全局对象。this你能解释一下含义会改变的不同情况以及它是如何使用的吗?

4

2 回答 2

0

更好的方法是“如何在 Javascript 中调用函数?”

在内部有一个函数原语,称为"[[Call]]"我们有一个接口,Function.prototype.call(thisArg, arguments...)所以这就是我将在这里使用的。

每次您在 Javascript 中调用函数时,您都在编写将转换为等效语句的语法,并且它会为您Function.call传递该语句。thisArg它完全取决于您调用函数的方式,而不取决于任何其他面向对象的概念。这是程序员在接触 Javascript 时习惯于其他语言中基于类的对象语义工作方式的主要困惑之一。

对于在全局上下文中调用的函数:

function foo(a) { console.log(a); return this; }
foo(5); // equivalent to foo.call(window, 5);
        // outputs 5, returns (Window)

在调用函数的情况下,就好像它链接到一个对象(点语法):

var o = { foo: function(a) { console.log(a); return this; } };
o.foo(5); // equivalent to o["foo"].call(o, 5)
          // outputs 5, returns (Object(o))

这就是它的全部。请注意,我们可以通过不同的方式获得相同的功能:

var x = o.foo;
x(5); // equivalent to x.call(window, 5);
      // outputs 5, returns (Window)

而且这个完全相同的功能根本不知道与o我们创建它的方法有任何关系。

我认为这个主题可以用简单的英语:

  • 如果您调用一个函数而不在前面放置一个点,this则将是window(全局对象)。
  • 如果一个点在前面,this将是该点前面的对象。

如果您不喜欢它的工作方式,您可以通过多种方式模拟不同的行为(例如Function.prototype.bind或将您自己的方式传递thisArgcallor apply)。

小字:在 ECMAScript 严格模式下,在window上面的示例中传递了 where ,而是传递undefined. 通过“前面的点”,我实际上只是在说 ,o["foo"](6)o.foo(6)相同this

于 2013-02-17T08:14:19.830 回答
-1

要了解this,您必须了解面向对象的编程。

在面向对象编程中,大多数方法(函数)属于objects. 在 Javascript 中,大多数objects是窗口元素;一个按钮,一个列表,一个 div。网页上几乎所有可以用名词来描述的东西都可能是object, 在某种程度上;少数不是的东西是objects.

因此,在面向对象编程中,您可能会遇到一个问题,即您可能有一个方法,例如onclick. 在里面onclick你有一些执行的代码;假设您正在将 a 的背景<div>从蓝色更改为绿色,然后在单击它时返回。让我们用英语/伪代码构建它。

myDiv.onClick {
  if the div that was clicked on has a background of blue then set that div's background to green
  else if the div that was clicked on has a background of green then set it to blue
}

所以,很容易,对吧?如果这不是面向对象的编程,您的函数将接受一个参数,div_id. 所以,

onClick(div_id theDiv) {
  if theDiv.background=blue then theDiv.background=green
  else if theDiv.background=green then theDiv.backgrond=blue
}

但是,这是面向对象的编程。onClick 是 div 的一种方法,面向对象编程的部分优势在于您不需要传递您所指的 div 之类的参数 - 当然,您所指的 div 是其参数被调用的那个!每个 div 都有自己对 onClick 的引用,可能有自己的副本,具体取决于您编写方法的方式。

不过,这确实留下了一个问题。你怎么说,

  if this Div's background is blue then set this div's background to green

? 答案是thisthis指当前方法所属的对象。所以,当一个 div 被点击时,它的 onClick 方法就会被调用;你有:

div.onClick() {
  if this.background=blue then this.background=green
  else if this.background=green then this.background=blue
}

所以你只写了一个 div.onClick 函数,现在每个 div 都可以随意变成蓝色或绿色。

于 2013-02-17T08:04:11.280 回答