我一直试图模仿jQuery的一些小插件的语法。我现在在内部使用$ object的方法一直在努力。让我来说明一下:
(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);
只要美元符号与参数一起使用(例如数组,在示例中这将是var arr = [1, 5, 7, 9]
),就会实例化一个新的Plugin对象,之后立即调用一个方法。
我写了一个小foreach
来测试,但似乎无法从框架内的函数调用它。最后的console.log(test);
将输出[[13,39,9]],而不是为var arr的每个元素执行此操作。我想这是因为在内部调用foreach时会覆盖this
。
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
for
方法中的i
循环索引(foreach
)正在被覆盖,因为您已在全局范围内声明它。始终使用var
来声明变量:
for (var i = 0; i < this.element.length; i++) {
values[i] = callback.call(this, this.element[i], i);
}