【问题标题】:What is context of function called inside another function without this?没有这个的另一个函数内部调用的函数上下文是什么?
【发布时间】:2020-06-02 20:59:31
【问题描述】:

我有代码,其中LivingBeing 是超类型,Man 是子类型。我在他们两个上都定义了toString() 方法。考虑下面的代码:

function LivingBeing() {}

LivingBeing.prototype.toString = function () {
    return "hi";
};

function Man() {}
Object.setPrototypeOf(Man.prototype, LivingBeing.prototype);
Man.prototype.toString = function () {
    return window.toString(); 
};


let m1 = new Man();
console.log(m1.toString()); // Prints [object Window]

但如果我删除 window 上下文:

function LivingBeing() {}

LivingBeing.prototype.toString = function () {
    return "hi";
};

function Man() {}
Object.setPrototypeOf(Man.prototype, LivingBeing.prototype);
Man.prototype.toString = function () {
    return toString(); // Window context removed now; Rest code same
};


let m1 = new Man();
console.log(m1.toString()); // Prints [object Undefined]

浏览器不应该将上下文的缺失视为窗口吗?打给谁的toString()

【问题讨论】:

  • Object.prototype.toString()
  • 仍然是相同的 window.toString(因为它是唯一全局公开的同名事物),只是这次在没有 window 作为其上下文的情况下调用它,因为你是如何称呼它的。你可以省略所有这些类的东西来证明这一点。

标签: javascript


【解决方案1】:

不应该把上下文的缺失当作浏览器的窗口吗?

不是,因为原生的toString 方法(继承自Object.prototype 的全局对象)是严格模式函数,在没有传递上下文时不会回退到全局对象。

【讨论】:

  • 我无法理解您所说的native toString 方法是什么意思?我的意思是它调用了哪个对象toString()
  • @Number945 它仍在调用window.toString()(这不是您想要做的吗?),因为window 的所有属性都在全局范围内可用。只是你现在像window.toString.call(undefined),或者const f = window.toString; f()一样使用它
  • 我没有发现 toString 是严格模式方法的记录。你是怎么找到的?
  • @Number945 ECMAScript §9.3 说“作为 ECMAScript 函数对象的内置函数必须是严格的函数。”而且规范中的任何步骤都没有应用马虎-mode 行为,it exists 仅适用于用户定义的函数。
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 2017-09-22
  • 2019-09-11
  • 1970-01-01
  • 2018-06-12
  • 2017-05-08
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多