#現代モジュール機構
大多数のモジュールは、ブースター/マネージャに依存しており、このようなモジュール定義を1つの友好的なAPIにパッケージ化する。ここでは特定の具体的なライブラリを研究しません。マクロを理解するために、簡単にコア概念を紹介します。
var MyModules = (
function Manager(){
var modules = {};
function define(name, deps, impl){
for(var i=0;i<deps.length; i++){
deps[i] = modules[deps[i]
}
modules[name] = impl.apply(impl,deps);
}
function get(name){
return modules[name];
}
return {
define,
get
}
}
)()
#thisは一体何ですか
thisは運転中にバインディングされており、作成時にバインディングされていません。thisの結合と関数宣言の位置は関係なく、関数の呼び出しに依存します。
#thisバインディング規則
1.標準バインディング
独立関数の呼び出しは、この規則を他の規則が適用されない場合のデフォルトと見なすことができます。
function foo(){
console.log(this.a)
}
var a = 'test'
foo() //test
foo()は、修飾なしの関数参照を直接使用して呼び出されるので、デフォルト規則、すなわちthisはグローバルオブジェクトにのみ使用されます。
厳密なモードを使用すると、グローバルオブジェクトはデフォルトのバインディングには使用できませんので、thisはundefinedにバインドされます。
2.陰式バインディング
function foo(){
console.log(this.a)
}
var obj = {
a:2,
foo:foo
}
obj.foo() //2
foo()が呼び出されると、その前に確かにobjへの参照が加えられています。関数がコンテキストオブジェクトを参照すると、このコンテキストオブジェクトに関数呼び出し中のthisをバインドします。foo()を呼び出したときにthisがobjに結合されるので、this.aとobj.aは同じです。
オブジェクト属性参照チェーンは、前のレイヤーのみとなり、または最後のレイヤーが呼び出し位置で機能します
##陰でなくします
最も一般的なthisバインディング問題は、陰的に結合された関数がバインディングされたオブジェクトを失うこと、すなわちデフォルトのバインディングが適用され、したがって、thisをグローバルオブジェクトまたはundefinedに結びつけることで、厳密なモードかどうかによって異なります。