【问题标题】:Javascript library each looping elements [duplicate]Javascript库每个循环元素[重复]
【发布时间】:2016-01-03 16:52:04
【问题描述】:

我有问题。我有自己的类似 jquery 的库。我称之为 $ 或 Meh(这就是它的名称 - Mehlib)并作为参数传递选择器。这个库调用document.querySelectorAll,它返回一个nodeList。要使用此列表中的元素(节点)(我的意思是,为它们调用一个方法),我必须循环它们。我已经想通了:

$('.selector-class').each(function (el) {
    el.style.display = 'none'; // hide element
});

Meh.fn = Meh.prototype = {
    map: function (callback) {
        var match = [];
        for (var i = 0; i < this.length; i++) {
            push.call( match, callback.call( this, this[i], i ) );
        }

        return match;
    },

    each: function (callback) {
        return this.map(callback);
    }
};

所以,这很好用,但是让我们认为自己很懒,好吗? 我想在循环(映射)到this 时“保存”当前元素并返回它。所以调用(上面的前 3 行)是这样的:

$('.selector-class').each(function () {
    this.style.display = 'none';
});

所以我还是想在映射节点的时候调用一个回调函数,但是我不想把单个映射的元素保存到回调的函数参数中

我尝试在 map 方法中创建新的库实例,并在当前方法中保存映射的重复单个节点,例如 this = duplicated[i];,但还有一个未捕获的错误:Uncaught reference error: Invalid left-hand side in assignmentUncaught reference error: $ is not defined 错误。

【问题讨论】:

  • 为什么要重新发明轮子?有许多经过良好测试的 DOM 库(轻量级和重度)可以像 jQuery 一样工作。如果重点是学习,那就另当别论了,否则不要浪费你的时间。
  • 因为我正在开发一个事物,如您所说,它是LIGHT,而不是几十kB。如果有很多汽车,为什么要制造自己的汽车(如果您有办法)?因为你想要你自己的,从螺丝钉到屋顶你都知道,而且你对它很感兴趣。
  • jQuery 的功能很轻巧,并且由对 javascript 和 DOM 有深入了解的人进行了广泛的测试和完善的文档记录和编写。尤其是当您询问有关对象范围的基本基本问题时,您的问题一无所有。
  • 好的。当你不打算帮忙的时候,什么都不要说。 jQuery 对于它的作用很轻,你是对的,但也许我不需要这样的功能,如果我需要一个小脚本怎么办?所以不要比你真正的聪明。 **编辑:** 如果您想知道,我正在学习。这是我在学校的实践考试,有配额。您不能携带没有内容但大小为 100kB 的网站。

标签: javascript


【解决方案1】:

你没有分配给this

但是,您可以在调用函数的上下文中定义 this 是什么。

即:

someObject.someMethod(); // "this" is someObject
someFunction(); // "this" is typically "window" but may be "null"

someFunction.call(someThing, arg1, arg2); // "this" is someThing

在最后一个中,您在调用函数时提供了任何您想要的 this

【讨论】:

  • 哦..所以我不明白调用函数()..所以第一个参数是this的值?
  • 正确。使用.call() 时,第一个参数将是this,然后所有后续参数将传递给函数本身。 .apply() 类似,但它需要 this 后跟一个 array 值作为参数传递。
  • 当我调用funct( arg1, arg2 )funct.call(someThing, arg1, arg2) 时,arg1 和 arg2 也会相等?
  • @Tralala lalala 没错,第一个参数变成了thisArg,其余的按顺序都是正常的参数。
【解决方案2】:

变化:

callback.call( this, this[i], i )

收件人:

callback.call( this[i], this[i], i )

这样您就可以将元素作为thisArg 传递。

【讨论】:

  • @Tralala lalala 不客气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2014-11-09
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多