从其他函数返回的原始函数是否不同于JS中的原始函数?

时间:2018-10-10 06:10:47

标签: javascript

我想知道为什么下面的代码会那样吗?

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

1 个答案:

答案 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();

对于现代代码功能,很可能始终处于严格模式。