2

有很多问题和答案涵盖了这种技术,但我似乎无法找到如何this为 call() 或 apply() 设置所需上下文的答案。

我明白那个

Array.prototype.slice.call(arguments)

有点等价于

arguments.slice()

arguments转换成一个正确的数组对象,但是如果我尝试对我自己的对象使用这个约定,它就不起作用。我试图写一个小测试这样做:

var Logger = function(){};
Logger.prototype.print = function(msg){ 
   console.log ((new Date()).getTime().toString() + msg); 
};

(function(){
   var o = {
    name: "Hi Bob!",
   };

   var l = new Logger();
   l.print(o.name); //works fine
   Logger.prototype.print.call(o.name); //calls print method, but 'msg' is undefined
}());

关于允许该功能应用程序在没有必要上下文的情况下工作Array.prototype的对象或对象是否有什么特别之处?arguments

4

2 回答 2

2

slice和你的函数之间的区别在于它slice使用上下文 ( this) 而你的函数只使用它的参数。

如果您真的想call与您的功能一起使用,请将其用作

Logger.prototype.print.call(null, o.name);

但你不妨使用

 Logger.prototype.print(o.name);
于 2013-03-18T15:53:50.510 回答
1

您的Logger.prototype.printprint 不会在this任何地方使用该变量,因此使用call()是没有意义的。您的函数期望msg作为参数传递。这就是为什么l.print(o.name);有效。

正如您在问题中所说:

Array.prototype.slice.call(arguments)

类似于arguments.slice()。所以:

Logger.prototype.print.call(o.name);

类似于o.name.print()。如您所见,这没有任何意义。

如果你真的想使用.call(),你可以这样:

Logger.prototype.print.call(null, o.name);

但是,正如您所看到的,这很愚蠢,而且比仅仅l.print(o.name);.

于 2013-03-18T15:56:42.743 回答