【问题标题】:Why is `this` set to `window` if I use `function.apply(undefined, args)`?如果我使用 `function.apply(undefined, args)`,为什么 `this` 设置为 `window`?
【发布时间】:2016-01-27 16:10:52
【问题描述】:

看看这个例子:

function aaa () {
    console.dir(this)
}

function bbb () {}

aaa.apply(undefined, [1,2,3]) // this in aaa is `window` object
aaa.apply(bbb, [1,2,3]) // this in aaa is `bbb` function

为什么this 在第一个应用案例中设置为window,即使我试图强制它为undefined

【问题讨论】:

  • 因为你的函数处于草率模式。
  • 非“严格模式”。在console.dir 之前添加"use strict";,它将显示undefined
  • 从未听说过严格模式,谢谢。我查一下。
  • @bodacydo - 强烈建议您阅读并了解严格模式以及与非严格模式的区别,然后开始将其用于所有代码。严格模式会将一些编码错误转化为即时错误,因此您可以立即看到并修复它们,而不是试图掩盖它们。

标签: javascript this apply window-object


【解决方案1】:

当不在严格模式下并且nullundefined 作为第一个参数传递给.apply() 时,this 将被设置为浏览器中的全局对象window

在严格模式下,它会将this 设置为您传递的实际值。


一般来说,非严格模式会尝试容忍错误,甚至会自动为您“修复”一些错误。这有时被证明是一个问题,因为本应立即出现编码错误的事情被系统“掩盖”了。发明严格模式有多种原因,其中一个原因是停止隐藏编码错误。

【讨论】:

  • undefined 和没有值一样吗?我将它作为未定义的值传递?还是undefined 不是一个值?
  • 我得查一下什么是严格模式。
  • @bodacydo - 在非严格模式下在 Chrome 中进行了一些简短的测试,在这种情况下“无价值”是 nullundefined。这些值将转换为window。使用其他的。
  • @bodacydo:是的,undefined 和“没有价值”一样好,当你谈到像 fn.apply() 这样的函数调用时。在草率模式下,this 值始终是一个对象,因此原始字符串、数字和布尔值被包装;并且使用全局对象而不是 nullundefined
  • 非常酷。每天学习新东西。多么美妙的体验。
【解决方案2】:

因为如果您不在strict mode 中,这就是函数调用的工作方式。如果没有严格模式,函数的this 引用总是指向一个对象,如果没有给出其他对象,它将是全局对象(即window)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多