this
никоим образом не относится к области применения.
(function(){
(function(){
(function(){
(function(){
alert( this ); //global object
})()
}).bind({})()
}).apply({})
}).call({})
this
разрешается только во время вызова функции и сводится к нескольким простым правилам.
- Если функция вызывается как свойство некоторого объекта, тогда этот объект будет
this
внутри функции
- Если функция вызывается как есть,
this
будет неопределенным, поэтому в нестрогом режиме это будет глобальный объект
- Если функция вызывается с помощью
.call/.apply
, тогда this
устанавливается непосредственно вами.
Таким образом, как вы можете видеть, оно подпадает под правило № 2, которое разрешается до undefined
. И поскольку нет "use strict";
:
установить ThisBinding для глобального объекта
Редактировать: Теперь я провел несколько быстрых тестов в RingoJS, и они фактически поместили «глобальный объект» внутри реального глобального объекта (как определено стандартами), который равен ModuleScope
. Просто потому, что фактический глобальный объект в большинстве реализаций js имеет Object и String и т. Д., Не делает объект глобальным, если он также содержит эти объекты. Причина, по которой вы можете получить доступ к String
и Object
в RingoJS, заключается в том, что они помещают их в прототип ModuleScope
:
var logs = require('ringo/logging').getLogger("h");
logs.info( Object.getPrototypeOf( this ) === this.global );
//true
Еще одно доказательство того, что ModuleScope
является действительным глобальным объектом:
this.property = "value";
logs.info( property );
//"value"
Так что от такого рода хитрости ничего не получится, это ничего не исправит:
function injectGlobal(){
globalProperty = "value"; // "use strict" would fix this!
}
injectGlobal()
logs.info( globalProperty );
//"value"
Rant over, this
относится к реальному глобальному объекту уже в соответствии с правилами, приведенными ранее в этом посте. this.global
это не реальный глобальный объект, как определено стандартами, это просто контейнер.
Кроме того, вы можете эмулировать это поведение в браузерах:
Рассмотрим scopehack.js
this.global = window.global || top.global || {};
Рассмотрим main.html:
<script src="scopehack.js"></script>
<script>
this.global.helloWorld = "helloWorld"; //"global scope"
this.helloWorld = "helloWorld" //"ModuleScope"
</script>
<iframe src="module.html"></iframe>
И, наконец, "module" module.html:
<script src="scopehack.js"></script>
<script>
with( this.global ) { //poor mans RhinoJS scope injection, doesn't work for writing
console.log( helloWorld ); //"global scope" - "helloWorld"
console.log( this.helloWorld ); //"ModuleScope" undefined
}
</script>
Какой из них является глобальным объектом как в module.html, так и в main.html? Это все еще this
.
TLDR:
var obj = {
"String": String,
"Object": Object,
.....
};
Не делает obj
глобальным объектом.