Javascript 带函数的语法

Javascript syntax with functions

我不确定这意味着什么或如何正确表达问题。

在第一个示例中我可以将变量放在函数之前 "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?

谢谢!

数组的示例有效,因为 JavaScript (ECMAScript5) 中的 Array 定义了一个 forEach 函数。

带有数字的示例不起作用,因为 Number 未定义 square 函数。您可以扩展 Number 以包括这样的平方函数:

Number.prototype.square = function(x) {
  return this * this;
};

语法方面,这里没有 "magic"。你描述的是两件截然不同的事情。

在您的第一个示例中,您将 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);

如果您从第一个示例中删除 forEach 函数,它仍然可以工作,这是因为 Array 类型具有内置的 forEach 函数。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

或者尝试将您的 forEach 功能更改为 each,您会发现它不再有效。

您要做的是向现有类型添加新方法。这在 JavaScript.

中不是好的做法