【问题标题】:Does it make sense to use .apply( ) and pass the same instance as context?使用 .apply() 并将相同的实例作为上下文传递是否有意义?
【发布时间】:2012-01-09 02:05:02
【问题描述】:

我正在阅读 O'Reilly 的 Javascript Web 应用程序。在本书的各个方面,作者使用了以下内容:

instance.init.apply(instance, arguments);

这有意义吗?这不完全一样吗:

instance.init(arguments);

.call() 和 .apply() 用于手动设置函数的执行上下文。当我打算使用原始执行上下文时,为什么要使用它们?

【问题讨论】:

    标签: javascript function call execution apply


    【解决方案1】:

    重点是arguments 是一个类似数组的对象。正在做...

    instance.init(arguments);
    

    ... 传递一个参数,它是一个包含某些参数的类数组对象。另一方面,做...

    instance.init.apply(instance, arguments);
    

    ... 将类数组对象作为单独的参数传递。确实,设置instance 有点用处,因为您已经编写了它,但是如果使用.apply,您只需设置this 的值。

    差异的简单示例:

    function log(a, b, c) {
        console.log(a, b, c);
    }
    
    function log2() {
        log.apply(null, arguments); // `this` value is not meaningful here,
                                    // it's about `arguments`
    }
    
    function log3() {
        log(arguments);
    }
    
    log(1, 2, 3);  // logs:  1, 2, 3
    
    log2(1, 2, 3); // logs:  1, 2, 3
    
    log3(1, 2, 3); // logs:  <Arguments>, undefined, undefined
                   //        where <Arguments> contains the values 1, 2, 3
    

    【讨论】:

    • 感谢您抽出宝贵时间回答,但 log2(1, 2, 3) 也会记录“1, 2, 3”。
    • 好的,所以澄清一下:唯一的区别是我可以调用一个函数并以编程方式将传递给我现在所在位置的参数转移到另一个函数,而不将它们转换为类似数组的结构? ---编辑---是的,明白了。非常感谢!
    【解决方案2】:

    如果 instance.init() 从另一个函数/表达式执行,则在该示例中使用 apply() 可确保 'this' === 实例,而不是 DOMWindow。

    var x = function(){ debugger; },
        y = function(){ x.apply(x, arguments); },
        z = function() { x(arguments); };
    
    y("abc", true, []); // this === x
    z("abc", true, []); // this === DOMWindow
    

    它只是指定上下文。

    【讨论】:

    • 虽然 .apply 和 .call 是上下文修饰符,但我相信在这种特殊情况下, .apply 的主要目的是不确定前面答案中所述的参数是否正确。尽管作为副作用,它确实可以确保您所说的正确上下文。
    • 没错,但如果是这种情况,那就是由于懒惰而误用了 apply()。
    • 好的...如果不使用 .apply,您将如何不确定参数的正确传递?真诚的好奇心 =)
    • 良好的架构。良好的接口,良好的验证;期望得到保证。当你有一个通用的外观工厂时,Apply() 很好,工厂不知道会发生什么。以下是此类工厂的示例,来自 abaaso:gist.github.com/1406313
    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多