当前位置: 首页 > 面试题库 >

Javascript中的“ this”关键字如何在对象文字中起作用?

於功
2023-03-14
问题内容

我已经看到“ this”关键字在函数中如何工作?,但我看不到它能回答以下问题。

给出以下代码:

var MyDate = function(date) {
    this.date = date;
};

var obj1 = {
    foo: new Date(),
    bar: new MyDate(this.foo)  //  this.foo is undefined
};

var obj2 = {};
obj2.foo = new Date();
obj2.bar = new MyDate(this.foo);  //  this.foo is undefined

var obj3 = {
    foo: new Date(),
    bar: new MyDate(obj3.foo)
};

var obj4 = {};
obj4.foo = new Date();
obj4.bar = new MyDate(obj4.foo);

为什么前两次尝试失败,而后两次尝试成功?如果this没有绑定到当前对象的文字,什么是它必然?


问题答案:

Javascript是一种后期绑定语言。实际上,绑定很晚。不仅this在编译时没有绑定,甚至在运行时也没有绑定(就像大多数其他后期绑定语言一样)。在javascript中,this是在通话期间绑定的。

绑定规则与大多数其他OO语言完全不同,这就是为什么它使许多不熟悉javascript的人感到困惑的原因。

基本上,this在代码中使用的方式和位置不会影响this其行为方式(无论它是独立的函数,对象字面量等都是无关紧要的),确定值的this是如何调用函数。

规则是:

1- 将函数称为构造函数时,将创建一个新对象并将this其绑定到该对象。例如:

function Foo () {
    this.bar = 1; // when called with the new keyword
                  // this refers to the object just created
}
new Foo().bar;

2- 当被称为对象方法时,this是指该方法所属的对象。基本上是最后一个点之前的名称。例如:

foo.bar = 1;
foo.baz = function () {
    alert(this.bar); // this refers to foo when called as foo.baz()
}
foo.baz();

3-
如果在任何函数外部使用或未将函数作为方法调用,则this引用全局对象。javascript规范除了说全局对象不存在外,没有给全局对象起任何名字,但对于浏览器来说,传统上称为window。例如:

bar = 1;
alert(this.bar); // this refers to the global object
foo = {
    bar: this.bar // also global object
}
function foofoo () {
    alert(this.bar); // also refers to the global object
}
foofoo();

4-
在事件处理程序中(例如onclick等)this是指触发事件的DOM元素。或者对于与DOM无关的事件,例如setTimeoutXMLHTTPRequestthis指的是全局对象。例如:

foo.bar = 1;
foo.baz = function () {
    alert(this.bar); // this would normally be foo but if this
                     // function is assigned to an event it would
                     // point to the element that triggered the event
}
somediv.bar = 2;
somediv.onclick = foo.baz; // clicking on somedive alerts 2 instead of 1

5- 最后,当使用call()apply()方法调用函数时,this可以将其重新分配给任何内容(谷歌“ mdn
function.prototype.call”)。这样,JavaScript中的任何对象都可以借用/窃取另一个对象的方法。例如:

cat = {
    type: "cat",
    explain: function () {
        return "I am a " + this.type;
    }
}
dog = {
    type: "dog"
}
cat.explain.call(dog); // returns "I am a dog"

随着Function.bind()现代JavaScript实现我们现在有另一个规则:

6-
函数也可以this使用bind()方法显式绑定到对象。该bind方法返回函数的新实例,该实例this绑定到传递给的参数bind。例如:

function explain () {
    return "I am a " + this.type;
}
dog = {
    type: "dog"
}
var dog_explain = explain.bind(dog);
dog_explain(); // returns "I am a dog"

ECMAscript 5引入了严格模式,该模式改变了未作为方法调用或通过call或apply调用的函数的含义,因此我们必须添加一个新规则:

7-
在严格模式下,this不允许引用全局对象(浏览器中的窗口)。因此,当一个函数将不会调用作为方法或this手动通过不绑定到任何东西callapplybindthis变为undefined

"use strict";
function foo () {
    return this;
}
foo(); // returns undefined instead of the global object

ECMAscript 6引入了箭头功能。箭头功能通过尽早绑定来改变行为方式。

8- 在箭头函数中,this在声明函数时绑定。因此this,在以下代码中:

var x = () => {return this};

就像该函数的声明一样,其行为类似于以下代码

var x = function () {return this}.bind(this);

请注意,由于thisin箭头函数是在声明函数时绑定的,因此 如果要使用继承,则不能使用arrow函数 。这是因为this函数中的in将
始终 指向父对象,而永远不会指向子对象。这意味着使箭头功能继承的唯一方法是覆盖父对象中的所有箭头功能。



 类似资料:
  • 我已经看到了“this”关键字在函数中是如何工作的?,但我没有看到它回答了下面的问题。 给定此代码: 为什么前两次尝试失败,后两次却奏效?如果未绑定到当前对象文字,那么它绑定到什么?

  • 本文向大家介绍“ this”关键字在JavaScript中如何工作?,包括了“ this”关键字在JavaScript中如何工作?的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,此关键字用作引用,以引用执行的代码的对象或主题。 示例

  • 问题内容: “ this”关键字如何工作? 问题答案: [§11.1.1]的关键字 所述关键字的计算结果为当前执行上下文的ThisBinding的值 这个绑定是JavaScript解释器在评估JavaScript代码时所维护的,例如特殊的CPU寄存器,其中包含对对象的引用。每当在以下三种情况之一中建立执行上下文时,解释器都会更新ThisBinding: 1.初始全局执行上下文 在顶级代码中评估的J

  • 本文向大家介绍javascript中this关键字详解,包括了javascript中this关键字详解的使用技巧和注意事项,需要的朋友参考一下 不管学习什么知识,习惯于把自己所学习的知识列成一个list,会有助于我们理清思路,是一个很好的学习方法。强烈推荐。 以下篇幅有点长,希望读者耐心阅读。 以下内容会分为如下部分: 1.涵义   1.1:this涵义   1.2:this指向的可变性 2.使用

  • 本文向大家介绍图解JavaScript中的this关键字,包括了图解JavaScript中的this关键字的使用技巧和注意事项,需要的朋友参考一下 JavaScript 是一种脚本语言,支持函数式编程、闭包、基于原型的继承等高级功能。JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发现JavaScript其实很难掌握,有些基本概念让人匪夷所思。其中JavaScript 中

  • 问题内容: 我刚刚遇到了一个有趣的JavaScript情况。我有一个类,该类的方法使用对象文字表示法定义了多个对象。在这些对象内部,正在使用指针。从程序的行为,我推断出指针是指向在其上调用方法的类,而不是由文字创建的对象。 尽管这是我期望的工作方式,但这似乎是任意的。这是定义的行为吗?跨浏览器安全吗?是否有任何推理依据说明它超出了“规格说明”的范围(例如,这是某些更广泛的设计决策/理念的结果)吗?