Eu já li o modo JavaScript rigoroso muitas vezes e alguns dizem "desativar com declarações". No passado, eu vi tudo isso andando de cavalo e assistindo flores, e passei, porque raramente uso essa afirmação nos tempos normais, por isso não tem muito a ver comigo mesmo. Hoje não posso deixar de me perguntar por que o "modelo rigoroso" não pode tolerar a declaração com?
A especificação do ECMAScript diz que "a instrução com é usada para definir o escopo do código em um objeto específico". Pode -se observar que a declaração com a declaração altera a cadeia de escopo.
function Person(name,age,sex){this.name = name;this.age = age;this.sex = sex;}(function(){var title = 'Applicant:';var zhangsan = new Person('Zhang San',20,'male');var str = '';with(zhangsan){str = title+name+', age'+age+'years,'+sex+'sex'+', posição '+job;} console.log (str);}) ();O código acima reportará a ReferenceError não capturada: o trabalho não está definido.
Se o bloco de declaração acima for alterado para
str = título+zhangsan.name+', idade'+zhangsan.age+'anos,'+zhangsan.sex+'sexo'+', posição'+zhangsan.job;
Não há erro, a saída é: Requerente: Zhang San, 20 anos, Macho, posição indefinida
Para variáveis no bloco de declaração, ao executar, você deve verificar se as propriedades deles estão em Zhangsan.
Sabemos que, ao executar um script, existem dois processos necessários, primeiro compilar e depois executar.
Obviamente, ao compilar, não é possível determinar quais propriedades o objeto representado por essa variável de Zhangsan possui. Só pode ser determinado que o Zhangsan é uma instância de pessoa quando executado. Portanto, não pode ser verdade que a variável no bloco de declaração com o Zhangsan ou uma variável na cadeia de escopo variável anterior durante a compilação.
Isso entra em conflito com o fato de que a variável é definida ao compilar o modo rigoroso; portanto, o modo rigoroso não permite que a diferença exista. Portanto, não é difícil entender que a declaração com está desativada no modo rigoroso.