Por que isso está em uma função anônima indefinida ao usar javascript no modo estrito? Eu entendo por que isso pode fazer sentido, mas não consegui encontrar uma resposta concreta.
Exemplo:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
Teste em um violino: http://jsfiddle.net/Pyr5g/1/ Verifique o logger (firebug).
javascript
anonymous-function
use-strict
T. Junghans
fonte
fonte
Respostas:
É porque, até ECMAscript 262 edição 5, havia uma grande confusão se as pessoas que estavam usando o
constructor pattern
, esqueciam de usar anew
palavra - chave. Se você esqueceu de usarnew
ao chamar uma função de construtor no ES3,this
referenciou o objeto global (window
em um navegador) e você iria sobrecarregar o objeto global com variáveis.Que era um comportamento terrível e para que as pessoas em ECMA decidiu, apenas para definir
this
aundefined
.Exemplo:
function myConstructor() { this.a = 'foo'; this.b = 'bar'; } myInstance = new myConstructor(); // all cool, all fine. a and b were created in a new local object myBadInstance = myConstructor(); // oh my gosh, we just created a, and b on the window object
A última linha lançaria um erro no ES5 estrito
"TypeError: this is undefined"
(que é um comportamento muito melhor)
fonte
this === window
é confuso e vaza o escopo global como um token em funçõesExiste um mecanismo chamado "boxing" que envolve ou altera o
this
objeto antes de entrar no contexto da função chamada. No seu caso, o valor dethis
deveria serundefined
porque você não está chamando a função como um método de um objeto. Se o modo não for estrito, neste caso, ele será substituído pelowindow
objeto. Nostrict
modo está sempre inalterado, é por isso que estáundefined
aqui.Você pode encontrar mais informações em
https://developer.mozilla.org/en/JavaScript/Strict_mode
fonte
De acordo com a resposta de This Stack Overflow , você pode usar
this
funções anônimas internas, simplesmente chamando.call(this)
no final dela.(function () { "use strict"; this.foo = "bar"; }).call(this);
fonte
this
será oWindow
objeto neste caso, o que pode não ser desejado