2013-02-10 29 views
5

Hiểu biết của tôi là tôi có thể gọi Array.prototype.slice.call(arguments, 1) để trả về đuôi của một mảng.Javascript 'arguments' Từ khóa

Tại sao mã này không trả về [2,3,4,5]?

function foo() { 
    return Array.prototype.slice.call(arguments,1); 
} 

alert(foo([1,2,3,4,5])); 

Trả lời

9

Vì bạn chỉ đi một luận — mảng.

Hãy thử alert(foo(1,2,3,4,5));

luận cứ được đánh số từ 0 trong JavaScript, vì vậy khi bạn bắt đầu lát tại 1 và vượt qua 1 đối số, bạn nhận được gì.

Lưu ý rằng nó có thể cản trở tối ưu hóa để cho phép đối tượng arguments bị "rò rỉ" ra khỏi chức năng. Bởi vì các răng cưa giữa arguments và các tham số chính thức, một trình tối ưu hóa không thể thực hiện bất kỳ phân tích tĩnh nào của hàm nếu đối tượng arguments được gửi ở một nơi khác, bởi vì nó không biết điều gì có thể xảy ra với các biến tham số.

+0

Sau đó, tốt hơn là sao chép các đối số? 'function foo() { \t var args = arguments; \t trả về Array.prototype.slice.call (args, 1); } ' – Eric

+1

Bài viết MDN trên từ khóa' arguments' mô tả vấn đề tối ưu hoá này mà bạn đã đề cập: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments – Eric

3

arguments{0: [1,2,3,4,5], length: 1}, là đối tượng giống như mảng với một phần tử. Đuôi của một mảng với một phần tử là mảng trống.

Hoặc thay đổi định nghĩa của hàm:

function foo(arr) { 
    return Array.prototype.slice.call(arr,1); 
} 

hoặc gọi hàm với:

foo(1,2,3,4,5); 
10

arguments là một đối tượng mảng giống như liệt kê các đối số và một vài đặc tính khác (chẳng hạn làm tham chiếu đến hàm hiện tại trong arguments.callee).

Trong trường hợp này, đối tượng arguments của bạn trông như thế này:

arguments { 
    0: [1,2,3,4,5], 
    length: 1, 
    other properties here 
} 

Tôi nghĩ rằng điều này giải thích hành vi mà bạn đang nhìn thấy khá tốt. Hãy thử xóa các dấu ngoặc mảng trong cuộc gọi hàm hoặc sử dụng arguments[0] để truy cập arry.

Các vấn đề liên quan