JS fornece alguns objetos, funções e construtores integrados para programarmos, como Math, parseInt, Object, Array, etc. Todos eles são visíveis e podem ser usados durante a programação. Por exemplo, posso usar um novo Objeto ou um novo Array.
Alguns são invisíveis e só podem ser fornecidos pelo motor em circunstâncias especiais. Esses tipos de objetos geralmente têm funcionalidade reduzida. Aqui estão alguns
1. Tipo de argumentos
O tipo Argumentos não pode ter seus objetos criados manualmente pelo programador, ou seja, não é possível criar novos Argumentos(). Possui e apenas um argumento de objeto
Copie o código do código da seguinte forma:
função função() {
console.log(argumentos[0]) // 1
console.log(argumentos.length) // 3
}
divertido (1, 2, 3)
O objeto de argumentos é criado quando a função é chamada e só é visível e usado dentro da função. Você pode ver que os argumentos são muito semelhantes ao Array, os elementos podem ser recuperados por índice e também possuem um atributo de comprimento. Mas não é Array. Não possui alguns métodos de Array como push, pop, etc. Os argumentos são definidos em ES5 10.6.
2. A função retornada por bind é muito especial.
bind é um novo método adicionado pelo ES5 ao Function.prototype. Ele é chamado diretamente na função como call/apply. Ele retorna uma função com contexto e parâmetros especificados.
Copie o código do código da seguinte forma:
função func(idade) {
console.log('nome: ' + este.nome + ', carreira: ' + idade)
}
var pessoa = {nome: 'John McCarthy'}
var f1 = func.bind(pessoa, 'cientista da computação')
f1() // nome: John McCarthy, carreira: cientista da computação
Você pode ver que a função retornada f1 é chamada usando parênteses como uma função normal. Tudo funciona bem, mas o código a seguir irá surpreendê-lo
Copie o código do código da seguinte forma:
função func(idade) {
console.log('nome: ' + este.nome + ', carreira: ' + idade)
}
var pessoa = {nome: 'John McCarthy'}
var f1 = func.bind(pessoa, 'cientista da computação')
console.log(f1.prototype) // indefinido
Comparando com o código acima, a última frase é diferente. f1() não é executado, mas f1.prototype é impresso e considerado indefinido.
Esquisito? Toda função não possui um atributo de protótipo. Isso é usado para implementar a herança de protótipo. Na verdade, a função retornada por bind é especial, não possui protótipo. Esta função especial é criada pelo mecanismo JS e não pode ser medida diretamente pelo programador cliente por meio de declaração de função ou função.
Isto está claramente afirmado na especificação ES5 15.3.4.5