Nó hợp lệ theo EcmaScript 3 và EcmaScript 5 không nghiêm ngặt, nhưng không hợp lệ trong chế độ nghiêm ngặt EcmaScript 5. Nó hoạt động trong tất cả các trình duyệt hiện đại và hầu hết các trình duyệt cũ. Nó không hoạt động ở chế độ nghiêm ngặt như khi chạy trong Firefox 5 với chỉ thị "use strict"
.
Từ phần EcmaScript 5 spec 10.6.11.c.ii
10,6 Arguments Object
...
Nếu đúng là sai và tên không phải là một phần tử của mappedNames, sau đó
Thêm tên làm phần tử của danh sách được ánh xạNames.
Cho phép g là kết quả của việc gọi hoạt động trừu tượng MakeArgGetter với đối số tên và env.
Cho p là kết quả của việc gọi hoạt động trừu tượng MakeArgSetter với đối số tên và env.
Gọi phương thức nội bộ của [[DefineOwnProperty]] của bản đồ đi qua ToString (indx), Trình mô tả thuộc tính {[[Set]]: p, [[Get]]: g, [[Configurable]]: true } và giả làm đối số .
Về cơ bản, đối tượng arguments
được một setter cho mỗi chỉ số để gán cho arguments[i]
thay đổi giá trị của tham số có tên ở vị trí i
. Có ngôn ngữ trong spec đó làm cho nó hoạt động ngược lại.
này nên làm việc ở chế độ không nghiêm ngặt trong bất kỳ phiên dịch
(function (x) {
alert("x=" + x + ", arguments[0]=" + arguments[0]); // Both should be 0
arguments[0] = 1;
alert("x=" + x + ", arguments[0]=" + arguments[0]); // both should be 1
x = 2;
alert("x=" + x + ", arguments[0]=" + arguments[0]); // both should be 2
})(0);
Nhưng nếu bạn chạy trên trên Firefox 5 với việc sử dụng chỉ thị nghiêm ngặt bạn nhận được hành vi khác nhau:
(function (x) {
"use strict";
alert("x=" + x + ", arguments[0]=" + arguments[0]); // Both should be 0
arguments[0] = 1;
alert("x=" + x + ", arguments[0]=" + arguments[0]); // x=0, arguments[0]=1
x = 2;
alert("x=" + x + ", arguments[0]=" + arguments[0]); // x=2, arguments[0]=1
})(0);
Nguồn
2011-06-22 00:30:57
+1 nhưng sẽ vẫn tốt nếu có một số liên kết đến các tiêu chuẩn áp dụng –
@James Khoury. Sẽ làm. –
@mike Wow thật nhanh! Lời giải thích tuyệt vời nữa, một số người trong chúng ta cần nó. ;) –