Javascript 如果我使用“function.apply(未定义,args)”,为什么将“this”设置为“window”?

Javascript 如果我使用“function.apply(未定义,args)”,为什么将“this”设置为“window”?,javascript,this,apply,window-object,Javascript,This,Apply,Window Object,看看这个例子: 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 为什么在第一种应用情况下,即使我试图强制它为未定义的,此设置为窗口?当不是在严格模式下,并且null或未定义的作为

看看这个例子:

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

为什么在第一种应用情况下,即使我试图强制它为
未定义的
设置为
窗口

当不是在严格模式下,并且
null
未定义的
作为第一个参数传递给
.apply()
将设置为浏览器中的
窗口
中的全局对象

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



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

当不处于严格模式时,
null
undefined
作为第一个参数传递给
。apply()
这个
将被设置为浏览器中
窗口的全局对象

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




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

因为如果不使用strict模式,函数调用就是这样工作的。如果没有严格模式,函数的
引用始终引用一个对象,如果没有提供其他对象,它将是全局对象(即
窗口
)。

,因为如果不在,函数调用就是这样工作的。如果没有严格模式,函数的
引用始终引用一个对象,如果没有提供其他对象,它将是全局对象(即
窗口
)。

因为函数处于草率模式。非“严格模式”。添加
“严格使用”
控制台.dir
之前,它将显示
未定义
。从未听说过严格模式,谢谢。我会查一下。@bodacydo-强烈建议您阅读并了解严格模式以及与非严格模式的区别,然后开始在所有代码中使用它。严格模式会将一些编码错误转化为即时错误,因此您可以立即看到它们,并可以修复它们,而不是试图掩盖它们。因为您的函数处于草率模式。非“严格模式”。添加
“严格使用”
控制台.dir
之前,它将显示
未定义
。从未听说过严格模式,谢谢。我会查一下。@bodacydo-强烈建议您阅读并了解严格模式以及与非严格模式的区别,然后开始在所有代码中使用它。严格模式会将一些编码错误转化为即时错误,因此您可以立即看到它们,并可以修复它们,而不是试图掩盖它们。
undefined
与no value相同吗?我把它作为一个未定义的值传递?或者
undefined
不是一个值吗?我必须查找什么是严格模式。@bodacydo-在非严格模式下对Chrome进行一些简短测试后,在这种情况下,“no value”是
null
undefined
。这些值将转换为
窗口
。其他函数也被使用。@bodacydo:Yes,
undefined
和“no value”一样好,当你谈论像
fn.apply()
这样的函数调用时。在sloppy模式下,
这个
值始终是一个对象,因此原始字符串、数字和布尔值被包装;并使用全局对象,而不是
null
undefined
。非常酷。每天学习新的东西。多么美妙的体验。
未定义的
是否等同于没有价值?我把它作为一个未定义的值传递?或者
undefined
不是一个值吗?我必须查找什么是严格模式。@bodacydo-在非严格模式下对Chrome进行一些简短测试后,在这种情况下,“no value”是
null
undefined
。这些值将转换为
窗口
。其他函数也被使用。@bodacydo:Yes,
undefined
和“no value”一样好,当你谈论像
fn.apply()
这样的函数调用时。在sloppy模式下,
这个
值始终是一个对象,因此原始字符串、数字和布尔值被包装;并使用全局对象,而不是
null
undefined
。非常酷。每天学习新的东西。多么美妙的经历啊。