2017.4.07 jsの中のfunctionが実現する方式

1986 ワード

関数はFD(関数定義),FE(関数式),関数コンストラクタから得られた関数(1)に分類されます. FDの栗:Fncation getTaste(){...}解析器は上のfunctionキーワードに出会い、上のコードが関数として定義されている場合を解析します.上記の形式に合わないものは、エラーが発生します.(2)FEのクリ:var fn=function(){…}解析器は上のフュージョンキーワードを表現の場合に解析します.本例のfunctionの後ろには関数名がありますが、関数定義内の呼び出しに限ります.外呼び出しはfnを使います.var fn=function sbfn(){……...sbfn(); //}
functionを表現に解析した場合、別の栗:1、function(''anonymous function is caled')}()があります.ここではコンマ演算子の場合、コンマの後の結果をundefinedとします.
!function(){ECMAScript}()=()ここは!演算子の場合、後の結果はundefinedに戻ります.逆を取って、結果はtrueです.(3)関数コンストラクタのクリは、この関数の[Scope]属性はグローバルオブジェクト(window)のみを含むのが主な特徴です.
var x = 10;

function f() {

var x = 20;
var y = 30;

var bar = new Function('alert(x); alert(y);');

bar(); // 10, "y"

}
f();ちなみに、Functionコンストラクタはnewキーワードを使ってもいいし、なくてもいいです.これらの変体は等価です.
関数を作成するアルゴリズム
以下の疑似コードは、関数作成のアルゴリズムを記述しています.これらの説明は、ECMAScriptの関数オブジェクトの詳細を理解するのに役立ちます.このアルゴリズムは、すべての関数タイプに適しています.
F = new NativeObject();

// [[Class]] "Function"
F.[[Class]] = "Function"

// Function
F.[[Prototype]] = Function.prototype

//
// F [[Call]]
//
F.[[Call]] =

//
// [[Construct]] new
//
// F.[[Call]] this
F.[[Construct]] = internalConstructor

//
// , F
F.[[Scope]] = activeContext.Scope
// new Function(...) ,
//
F.[[Scope]] = globalContext.Scope

//
F.length = countParameters

// F
__objectPrototype = new Object();
__objectPrototype.constructor = F // {DontEnum}, x
F.prototype = __objectPrototype

return F
F.[[Prottype]は関数のプロトタイプで、F.prototypeはこの関数を通じて作成されたオブジェクトのプロトタイプです.
転載先:https://www.cnblogs.com/FineDay/articles/6677283.html