2
function MyArray() {
    var self = this.arguments; //<---
    this.toString = function() {
        return self;
    };

}

var c = new MyArray(2, 3, 1, '232');
console.log(c.toString());

不明确的

function MyArray() {
    var self = arguments; //<---
    this.toString = function() {
        return self;
    };

}

var c = new MyArray(2, 3, 1, '232');
console.log(c.toString());

[2,3,1,'232']

那么,为什么会这样呢?this.argumentsarguments有什么区别?

4

2 回答 2

2

在 JS 中,this表示“调用上下文”,可以有多种不同的设置方式。它实际上与变量范围无关。它们是完全不同的概念。这就是为什么arguments可以作为变量使用,而不是this.

的值this因调用函数的方式而异。


作为方法调用

例如,如果我这样做...

my_obj.myMethod();

...thenthis将引用,my_obj因为该函数myMethod是从my_obj.


作为函数独立调用

但如果我这样做...

var m = my_obj.myMethod;
m();

尽管my_objmyMethod与第一个示例的代码相同,但 this 的值通常会更改为global对象。


.call使用或调用.apply

this也可以设置其他几种方式。

m.call(my_other_obj, "more", "args");

m.apply(my_other_obj, ["more", "args"]);

使用.callor .apply,传递的第一个参数变成 的值this。两者之间的区别在于其余参数的传递方式。


创建使用.bind

还有.bind()一个以与 相同的方式接受参数.call(),但创建并返回一个新函数,其this值和任何其他参数永久设置。


new使用运算符调用

最后一种方法是当您将函数作为构造函数调用时。为此,您使用new运算符。

var new_obj = new m;

var new_obj = new obj.m;

在这两种情况下, 的值都this将是一个正在构造的新对象。new除非已将调用的函数设置为用作构造函数,否则您不应使用。

于 2012-07-01T20:27:38.380 回答
1

没有this.arguments。然而arguments,它是一个类数组对象,它始终存在于函数内部,并引用调用中给出的参数。

于 2012-07-01T19:56:17.857 回答