2013-05-17 4 views
0

Я пытался подражать некоторым синтаксисом jQuery для гораздо меньшего плагина. Я уже давно пытаюсь использовать методы объекта $ внутри. Позвольте мне проиллюстрировать:Javascript framework не может действительно вызывать методы изнутри

(function() { 
    window.$ = function (element) { 
     return new Plugin(element); 
    }; 

    var Plugin = function (element) { 
     this.element = element; 
    }; 

    Plugin.prototype = { 
     foreach: function(callback) { 
      // Of course the "foreach" function will be bigger than this, this is just for testing. 
      var values = []; 
      for (i = 0; i < this.element.length; i++) { 
       values[i] = callback.call(this, this.element[i], i); 
      } 

      return values; 
     }, 
     someOtherFunctionThatUsesForeachInternally: function() { 
      var arr = []; 
      $([6, 32, 2]).foreach(function(item, key) { 
       arr[key] = item + 7; 
      }); 
      return arr; 
     } 
    }; 
})(); 

/* Desired result: 
[ 
    [13, 39, 9], 
    [13, 39, 9], 
    [13, 39, 9], 
    [13, 39, 9] 
] 
*/ 

var arr = [1, 5, 7, 9]; 
var test = []; 

$(arr).foreach(function(value, key) { 
    test[key] = this.someOtherFunctionThatUsesForeachInternally(); 
}); 

console.log(test); 

Новый объект Plugin инстанциируется всякий раз, когда знак доллара используется в сочетании с аргументом (например, массив, в примере это будет var arr = [1, 5, 7, 9]) и метод немедленно вызывается после того, что ,

Я написал небольшой файл foreach для тестирования, но его невозможно вызвать из функции внутри рамки. console.log(test); в самом конце будет выводить [[13, 39, 9]] вместо того, чтобы делать это для каждого элемента var arr. Я думаю, это потому, что перезаписывается, когда foreach называется внутренне.

Любые идеи относительно того, как решить эту проблему?

ответ

1

Код for (i) в вашем методе foreach перезаписывается, потому что вы объявили его в глобальной области. Всегда используйте var объявлять переменные:

for (var i = 0; i < this.element.length; i++) { 
    values[i] = callback.call(this, this.element[i], i); 
} 

DEMO:http://jsfiddle.net/QhXa7/

+0

Черт! Так просто – user2180613

+0

@ user2180613 Было больно найти :) Все выглядело хорошо, поэтому я не понимал, почему это не сработает. Затем я случайно понял, что «var» там не было, добавил его и попробовал еще раз, и он сработал :) – Ian

+1

Получение привычки сбрасывать код через JShint - хороший способ поймать эту ошибку, прежде чем она превратится в актуальная проблема. – Racheet

Смежные вопросы