我不确定这意味着什么或如何正确地说出问题。
在第一个例子中,我可以将变量放在函数" numbers1.forEach(...)"之前。但在第二个例子中,我不能" num.square()"?
function forEach(array, action) {
for (var i = 0; i < array.length; i++)
action(array[i]);
}
var numbers2 = [1, 2, 3, 4, 5], sum = 0;
forEach(numbers2, function(number) {
sum += number;
});
console.log(sum);
// → 15
var numbers1 = [1, 2, 3, 4, 5], sum = 0;
numbers1.forEach(function(number) {
sum += number;
});
console.log(sum);
// → 15
// this works!
但这不起作用
var square = function(x) {
return x * x;
};
var num = 12;
console.log(square(num));
// → 144
console.log(num.square());
// → TypeError: undefined is not a function (line 9)
// does not work?
谢谢!
答案 0 :(得分:2)
语法方面,没有&#34;魔法&#34;发生在这里。你描述了两件截然不同的事情。
在第一个示例中,您将Array
传递给您自己定义的forEach
方法。在第二个示例中,您正在调用的forEach
实际上是Array
上的内置方法(请参阅MDN)。如果您将 forEach
更改为不调用action
,则会发现您的内容中断,第二个仍然有效。
您可以自己实现此功能。您可以向Number
添加一个函数以使您的第二个示例正常工作(尽管这不是推荐的做法,因为它可能会与未来的JavaScript功能[以及许多其他原因]相冲突或破坏现有功能):
Number.prototype.square = function() {
return this * this;
};
var num = 12;
var squared = num.square();
alert(squared);
&#13;
答案 1 :(得分:0)
数组的示例有效,因为JavaScript(ECMAScript5)中的Array
定义了forEach函数。
带有数字的示例不起作用,因为Number
未定义square
功能。您可以扩展Number
以包含方形函数,如下所示:
Number.prototype.square = function(x) {
return this * this;
};
答案 2 :(得分:0)
如果从第一个示例中删除forEach
函数,它仍然有效,这是因为Array类型具有内置forEach
函数。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
或者尝试将forEach
功能更改为each
,您会发现它将不再有效。
您要做的是向现有类型添加新方法。这不是JavaScript中的好习惯。