我正在阅读O'Reilly的Javascript Web Applications。在本书的各个方面,作者使用了以下内容:
instance.init.apply(instance, arguments);
这有什么意义吗?这不完全相同:
instance.init(arguments);
.call()和.apply()用于手动设置函数的执行上下文。当我打算使用原始执行上下文时,为什么要使用它们呢?
答案 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
它只是指定上下文。