为什么我需要为一个原型方法调用声明一个变量,而不是另一个?

时间:2013-12-28 08:57:55

标签: javascript arrays

我正在使用这个相对简单的代码:

Array.prototype.doubleAll = function () {
  output = [];
  for (var i = 0; i < this.length; i++) {
    output.push(this[i] * 2);
  }
  return output;
};

console.log([1,2,3].doubleAll());

Array.prototype.myEach = function (fun) {
  output = [];
  for (var i = 0; i < this.length; i++) {
    output.push(fun(this[i]));
  }
  return output;
};

a = [1,2,3];

a.myEach(function (num) {
  console.log(num);
});

第一个console.log命令,直接在数组上调用而不是指向数组的变量,工作正常;第二个console.log适用于指向数组的变量,但不能直接在数组上运行。

例如,

[1,2,3].myEach(...)

失败了,但是

[1,2,3].doubleAll()

a.myEach(...)

都工作。

编辑:

在[1,2,3]而不是变量a(== [1,2,3])上调用myEach时返回的错误是

[1,2,3].myEach(function (num) {
        ^
TypeError: Cannot call method 'myEach' of undefined

有人可以向这个新手解释一下这种情况的原因吗?

2 个答案:

答案 0 :(得分:0)

我不知道你有什么错误,但我在node.js上尝试了这个并且它运行良好:

Array.prototype.doubleAll = function () {
  var output = [];
  for (var i = 0; i < this.length; i++) {
     output.push(this[i] * 2);
  }
  return output;
};

console.log([1,2,3].doubleAll());

Array.prototype.myEach = function (fun) {
   for (var i = 0; i < this.length; i++) {
       fun(this[i]);
   }
};

[1,2,3,4,5].myEach(function (num) {
    console.log(num);
});

当然,你不需要输出“var in myEach,因为你什么都不返回,你调用函数代替。第二个问题,你必须为输出添加“var”,否则它会成为一个全局变量,可能会有意想不到的哈巴狗。

答案 1 :(得分:0)

输出未在函数中声明,并且将创建window.output但代码仍然有效:

Array.prototype.myEach = function (fun) {
  var output = [],i;
  for (i = 0; i < this.length; i++) {
    output.push(fun(this[i]));
  }
  return output;
};

[1,2,3].myEach(function (num) {
  console.log(num);
});

扩展本机对象breaks encapsulation,但如果您的代码永远不会与第三方库一起运行,那么就不必担心太多了。