Does it make sense to use .apply( ) and pass the same instance as context?

后端 未结 2 1049
天涯浪人
天涯浪人 2021-01-22 10:09

I\'m reading Javascript Web Applications, from O\'Reilly. At various points in the book, the author uses something along the following:

instance.init.apply(insta         


        
相关标签:
2条回答
  • 2021-01-22 10:22

    The point is that arguments is an array-like object. Doing ...

    instance.init(arguments);
    

    ... passes one argument, which is an array-like object containing certain arguments. On the other hand, doing ...

    instance.init.apply(instance, arguments);
    

    ... will pass the array-like object as separate arguments. It is true that setting instance is kind of useless because you already wrote it, but if using .apply you simply need to set the this value as well.

    A quick example of the difference:

    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
    
    0 讨论(0)
  • 2021-01-22 10:34

    Using apply() in that example insures that 'this' === instance, instead of DOMWindow if instance.init() is executed from another function/expression.

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

    It's simply specifying context.

    0 讨论(0)
提交回复
热议问题