代码之家  ›  专栏  ›  技术社区  ›  user120242

有人能解释一下这个Javascript方法吗?

  •  24
  • user120242  · 技术社区  · 15 年前

    原始资料来源: http://twitter.com/tobeytailor/status/8998006366

    (x=[].reverse)() === window // true
    

    1 回复  |  直到 14 年前
        1
  •  41
  •   bobince    15 年前

    这与奇怪的方式有关 this

    [].reverse
    

    方法是什么 reverse 在空列表上。如果您通过以下方式之一调用它:

    [].reverse();
    []['reverse']();
    ([].reverse)();
    

    绑定到列表实例 [] . 但如果你拆下它:

    x= [].reverse;
    x();
    

    它执行时没有任何错误 -绑定,所以 window )对象,这是JavaScript最糟糕、最具误导性的设计错误之一。

    (x=[].reverse)()
    

    也正在进行分离。赋值操作符返回它所传递的同一个函数对象,因此看起来它什么也不做,但它的副作用是打破导致JavaScript绑定的有限特例 .

    你是说:

    Array.prototype.reverse.call(window)
    

    ,就像许多其他 Array.prototype object.length )并返回该对象。因此,它将返回为任何具有 length

    具有一个长度属性,该属性对应于 window.frames.length ,因此使用 窗口 窗口

    1. 窗口 允许是主机对象而不是本机对象;在这种情况下,关于您可以传递给其他原型的方法的保证不一定适用;和
    2. 如果窗口实际上有frames/iframe,它将尝试反转它们的顺序,这将不起作用,因为frames集合是只读的。

    ===window