我是Java语言的新手,最近我开始研究js原型,并被以下代码中的一些奇怪输出所迷惑:
Array.prototype.print = function() {
console.log(this)
}
[1, 2, 3, 4].print();
谁能告诉我为什么返回
无法读取未定义的属性'print'
如果我声明var array = [1, 2, 3, 4]
,然后用array.print()
调用print函数,它可以正常工作,所以我很困惑这有什么不同?
Array.prototype.print = function() {
console.log(this)
}
var array = [1, 2, 3, 4]
array.print()
答案 0 :(得分:6)
您可以只添加一个分号来分隔对该函数的访问。
您所拥有的是函数表达式的property accessor,并带有逗号运算符,这些运算符返回4
进行访问。在这种情况下,ASI(automatic semicolon insertion)不起作用。
Array.prototype.print = function() {
console.log(this)
}[1, 2, 3, 4] //.print(); // tries to get property 4 of the function
// and then tries to call a function from undefined
在函数表达式的block语句后需要分号。
Array.prototype.print = function() {
console.log(this)
};
[1, 2, 3, 4].print();
答案 1 :(得分:1)
如果一次性运行整个代码块,则不能保证最后一行将在第一个代码块之后运行。
分别运行两个块将突出显示此差异,您将看到第二个块的正确输出。
首先运行:
Array.prototype.print = function() {
console.log(this)
}
然后运行:
[1, 2, 3, 4].print();
有几种方法可以使它们异步运行。一种简单的方法是将最后一行包装在setTimeout中(根据您的用法,这可能不合适)。
例如
Array.prototype.print = function() {
console.log(this)
}
setTimeout(()=> {
[1, 2, 3, 4].print();
}, 1000)