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
RingoJSにアクセスできる理由Object
は、それらが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.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
グローバルオブジェクトを作成しません。