2016-04-16 5 views

ответ

7

Так что аргументы являются примером?

Это пример Object. Кажется, нет никакого публичного конструктора Arguments, который вы можете использовать с instanceof, чтобы идентифицировать его таким образом.

Если вы хотите, чтобы однозначно идентифицировать его, а затем:

Object.prototype.toString.call(arguments) === "[object Arguments]" 

является безопасным способом идентифицировать его.

В отношении section 9.4.4 in the EcmaScript 6 specification объект arguments является обычным объектом или экзотическим объектом. Вот что говорит спецификация:

Большинство функций ECMAScript предоставляют объекты аргументов, доступные для их кода . В зависимости от характеристик определения функции его аргументным объектом является либо обычный объект, либо аргументы экзотический объект.

An аргументов экзотическое объект представляет собой экзотический объект, массив индекса свойство карты к формальным параметрам переплетов с вызовом связанной с ним функцией ECMAScript.

Аргументы экзотических объектов имеют одинаковые внутренние слоты как обычные объекты. Они также имеют внутренний разъем [[ParameterMap]] . Объекты обычных аргументов также имеют внутренний слот [[ParameterMap]] , значение которого всегда не определено. Для обычных объектов аргументов внутренний слот [[ParameterMap]] используется только Object.prototype.toString (19.1.3.6), чтобы идентифицировать их как таковые.

Поскольку это «экзотический» объект, это по существу означает, что он не соответствует всем нормальным и ожидаемым соглашениям. Например, нет функции-конструктора, из которой вы можете создать свой собственный объект. И, поскольку нет никакой функции конструктора public, это, вероятно, также объясняет, почему нет instanceof, что вы можете протестировать его, чтобы однозначно идентифицировать его.

0

Вы можете получить имя функции, где arguments вернулся с использованием callee.name

function test() { 
    this.args = arguments; 
} 

var obj = new test(); 

console.log(obj.args.callee.name); 

function test() { 
    return arguments 
} 

console.log(test().callee.name); 

Смотри также Why was the arguments.callee.caller property deprecated in JavaScript?, Arguments object

+2

не может сделать это в 'strict' режиме. – jfriend00

+0

@ jfriend00 Да; включая ссылку на более подробную информацию. – guest271314

Смежные вопросы