使用.apply()并将相同的实例作为上下文传递是否有意义?

时间:2011-11-29 18:24:59

标签: javascript function call execution apply

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

instance.init.apply(instance, arguments);

这有什么意义吗?这不完全相同:

instance.init(arguments);

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

2 个答案:

答案 0 :(得分:3)

关键是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

答案 1 :(得分:0)

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

var x = function(){ debugger; },
    y = function(){ x.apply(x, arguments); },
    z = function() { x(arguments); };

y("abc", true, []); // this === x
z("abc", true, []); // this === DOMWindow

它只是指定上下文。