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 和参数之间有什么区别?
答案 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_obj
和myMethod
与第一个示例的代码相同,但其值通常会更改为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
,除非调用的函数已被设置为用作构造函数。