为什么我不能使用this.arguments,而参数工作?

时间:2012-07-01 19:51:55

标签: javascript

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.arguments 参数之间有什么区别?

2 个答案:

答案 0 :(得分:1)

没有this.arguments。但是arguments是一个类似于数组的对象,always exists inside functions并且引用了调用中给出的参数。

答案 1 :(得分:1)

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

this的值根据函数的调用方式而有所不同。


被称为方法

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

my_obj.myMethod();

...然后this将引用my_obj,因为函数myMethod是从my_obj的上下文调用的。


作为一项功能独立调用

但如果我这样做......

var m = my_obj.myMethod;
m();

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


使用.call.apply

进行了调用

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

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

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

使用.call.apply,传递的第一个参数变为this的值。两者之间的区别在于如何传递其余参数。


使用.bind

创建

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


使用new运算符

进行调用

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

var new_obj = new m;

var new_obj = new obj.m;

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