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
。非常酷。每天学习新的东西。多么美妙的经历啊。