我想知道为什么下面的代码会那样吗?
function hasOwnProperty() {
return Object.prototype.hasOwnProperty;
}
hasOwnProperty()() //Uncaught TypeError: Cannot convert undefined or null to object
Object.prototype.hasOwnProperty() // false
Object.prototype.hasOwnProperty === hasOwnProperty() // true
答案 0 :(得分:2)
hasOwnProperty()()
运行存储在hasOwnProperty
中的函数Object.prototype
,但是它在undefined
的上下文中运行,因此会出现错误cannot convert undefined or null to object
。 / p>
这与使用数组的push
函数执行此操作相同,在这种情况下不再为push
调用arr
,但没有任何上下文:< / p>
var array = []
var push = array.push
console.log(push === array.push) // true
console.log(push === Array.prototype.push) // true
array.push(1) //works as expected
push(2) // fails because push is called without an object
Object.prototype.hasOwnProperty()
在hasOwnProperty
引用的对象的上下文中运行Object.prototype
,因此不会返回错误。
Object.prototype.hasOwnProperty === hasOwnProperty()
返回true
,因为它们都引用相同的函数。
重要的是如何调用hasOwnProperty
函数。 hasOwnProperty
将在内部使用this
来检查传递给hasOwnProperty
的属性名称是否存在于this
上。
因此,您需要在对象上调用hasOwnProperty
,否则this
将是undefined
。
如果未在对象上调用函数,它将具有什么上下文取决于运行的环境以及是否在strict mode中。
如果该功能未处于严格模式,则它将在浏览器中为window
:
function test() {
console.log(this === window)
}
test();
但是大多数现代代码都在严格模式下运行,然后this
将是undefined
:
'use strict'
function test() {
console.log(this)
}
test();
对于现代代码功能,很可能始终处于严格模式。