有人可以解释this
Javascript 中的关键字吗?最好用简单的英语,不要引用在线资源或教科书。我很确定我已经通读了那些。我还没有完全掌握这个概念。
我知道这this
可能有几种不同的含义,具体取决于它的使用方式和时间。
例如,我读到它在某些情况下可以引用全局对象。this
你能解释一下含义会改变的不同情况以及它是如何使用的吗?
有人可以解释this
Javascript 中的关键字吗?最好用简单的英语,不要引用在线资源或教科书。我很确定我已经通读了那些。我还没有完全掌握这个概念。
我知道这this
可能有几种不同的含义,具体取决于它的使用方式和时间。
例如,我读到它在某些情况下可以引用全局对象。this
你能解释一下含义会改变的不同情况以及它是如何使用的吗?
更好的方法是“如何在 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
或将您自己的方式传递thisArg
给call
or apply
)。
小字:在 ECMAScript 严格模式下,在window
上面的示例中传递了 where ,而是传递undefined
. 通过“前面的点”,我实际上只是在说 ,o["foo"](6)
与o.foo(6)
相同this
。
要了解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
? 答案是this
。 this
指当前方法所属的对象。所以,当一个 div 被点击时,它的 onClick 方法就会被调用;你有:
div.onClick() {
if this.background=blue then this.background=green
else if this.background=green then this.background=blue
}
所以你只写了一个 div.onClick 函数,现在每个 div 都可以随意变成蓝色或绿色。