JS предоставляет нам некоторые встроенные объекты, функции и конструкторы для программирования, такие как Math, parseInt, Object, Array и т. д. Все они видимы и могут использоваться во время программирования. Например, я могу использовать новый объект или новый массив.
Некоторые из них невидимы и могут быть предоставлены двигателем только в особых обстоятельствах. Эти типы объектов часто имеют ограниченную функциональность. Вот некоторые
1. Тип аргументов
Объекты типа Arguments не могут быть созданы программистом вручную, т. е. вы не можете создать new Arguments(). Он имеет только один объектный аргумент
Скопируйте код кода следующим образом:
функция func() {
console.log(arguments[0]) // 1
console.log(arguments.length) // 3
}
весело(1, 2, 3)
Объект аргументов создается при вызове функции и виден и используется только внутри функции. Вы можете видеть, что аргументы очень похожи на Array, элементы можно получать по индексу, а также у них есть атрибут длины. Но это не Array. В нем нет некоторых методов Array, таких как push, pop и т. д. Аргументы определены в ES5 10.6.
2. Функция, возвращаемая привязкой, очень особенная.
bind — это новый метод, добавленный ES5 в Function.prototype. Он вызывается непосредственно из функции, например call/apply. Он возвращает функцию с указанным контекстом и параметрами.
Скопируйте код кода следующим образом:
функция func(возраст) {
console.log('name: ' + this.name + ', карьера: ' + возраст)
}
var person = {name: 'Джон Маккарти'}
var f1 = func.bind(человек, «ученый-компьютерщик»)
f1() // имя: Джон Маккарти, карьера: ученый-компьютерщик
Вы можете видеть, что возвращаемая функция f1 вызывается с использованием круглых скобок, как обычная функция. Все работает нормально, но следующий код вас удивит
Скопируйте код кода следующим образом:
функция func(возраст) {
console.log('name: ' + this.name + ', карьера: ' + возраст)
}
var person = {name: 'Джон Маккарти'}
var f1 = func.bind(человек, «ученый-компьютерщик»)
console.log(f1.prototype) // не определено
По сравнению с приведенным выше кодом последнее предложение отличается. f1() не выполняется, но f1.prototype распечатывается и оказывается неопределенным.
Странный? Разве у каждой функции нет атрибута прототипа? Он используется для реализации наследования прототипа. Действительно, функция, возвращаемая привязкой, особенная, у нее нет прототипа. Эта специальная функция создается движком JS и не может быть непосредственно измерена клиентским программистом посредством объявления функции или функции.
Это четко указано в спецификации ES5 15.3.4.5.