これは関数内の特別なオブジェクトです。これは、関数が実行される環境オブジェクトを指します(記事の最後に追加の説明をします)。この値は、関数を呼び出す前には定かではありません。異なる呼び出し方法により、この値が変更されます。
window.num = 22; var o = {num:11}; function saynum(){alert(this.num)} saynum(); // 22o.saynum = saynum; o.saynum(); // 11覚えておいてください:関数名は、ポインターを含む変数です。したがって、異なる環境で実行されたとしても、グローバルSaynum()関数はo.saynum()と同じ関数です。
1.グローバル範囲で関数を呼び出すとき
グローバルスコープで呼ばれるこのオブジェクトはウィンドウを指します
匿名関数の実行はグローバルであるため、このオブジェクトは通常、ウィンドウも指しています。
function fn1(){console.log(this);} fn1();2。新しいオペレーターを通じて呼び出されました
これは、インスタンスオブジェクトを参照します
function person(name){this.name = name;} person.prototype.printname = function(){alert(this.name); // byron}; var p1 = new person( 'byron');3。オブジェクトとしてのメソッド呼び出し
これはオブジェクトを参照します
var obj1 = {name: 'byron'、fn:function(){console.log(this); }}; obj1.fn();4。間接コール
電話して応募してください
各関数には、Call()とapply()の2つの非相続メソッドが含まれています。これらの2つの方法の目的は、特定の範囲で関数を呼び出すことです。これは、関数本文のこのオブジェクトの値を設定するのと実際に同等です。言い換えれば、関数は直接呼び出され、呼び出すときに実行環境が指定されます
window.color = 'red'; var o = {color: 'blue'}; function sakscolor(){alert(this.color);} saycolor.call(this); // redsaycolor.call(windo); // redsaycolor.call(o); // blue(1)メソッドを適用します
2つのパラメーターを受信します。1つは関数で実行される関数の範囲、もう1つはパラメーター配列です。
(2)通話方法
呼び出し方は適用方法と同じです。違いは、パラメーターを受信する方法が異なることです。コールメソッドの場合、最初のパラメーターは、この値が変更されておらず、変更は他のパラメーターが関数に直接渡されることです。
function fn(){console.log(this)// windwow function innerfn(){console.log(this)} innerfn.call(this)// window} fn(); function fn0(){console.log(this)// window}関数fn1(){fn0.call(this); console.log(this); // window} fn1(); function fn0(){console.log(this)// object} var o = {fn1:function fn1(){fn0.call(this); console.log(this); // object}} o.fn1();5.Bindメソッド
この方法は、値がbind()関数に渡された値に拘束される関数のインスタンスを作成します。つまり、新しい関数が返され、これが関数内で渡された最初のパラメーターになります。
window.color = 'red'; var o = {color: 'blue'}; function sakscolor(){alert(this.color)} var objectsaycolor = saycolor.bind(o); objectsaycolor(); // blue補足注:環境定義を実行します
関数がアクセス許可がある変数またはその他のデータを定義します。各実行環境には、それに関連付けられた変数オブジェクトがあります。環境で定義されているすべての変数と関数は、このオブジェクトに保存されます。私たちが記述するコードはこのオブジェクトにアクセスできませんが、パーサーはデータを処理するときに背景でそれを使用します。
1。実行環境の作成:
1。グローバル実行環境
Webブラウザーでは、グローバル実行環境はウィンドウオブジェクトと見なされるため、すべてのグローバル変数と関数はウィンドウオブジェクトのプロパティと方法として作成されます。コードがブラウザにロードされると、グローバル実行環境が作成されます(グローバル実行環境は、Webページまたはブラウザを閉じるときにのみ破壊されます)。
2。ローカル実行環境
各関数には独自の実行環境があるため、ローカル実行環境は関数オブジェクトです。関数が呼び出されると、関数のローカル環境が作成されます(関数内のコードが実行され、環境が破壊され、その中に保存されているすべての変数と関数定義も破壊されます)。
この実行環境と関連する可変オブジェクトは、次のように説明されています。
var a = 1; function fn(num1、num2){var b = 2; function fninner(){var c = 3;アラート(A + B + C); } fninner(); // fninnerが呼ばれるときのローカル実行環境の作成} fn(4,5); // fnが呼ばれるときのローカル実行環境の作成2。スコープチェーン
JavaScript関数の実行は、スコープチェーンを使用します。このスコープチェーンは、関数が定義されているときに作成されます。関数が定義されると、実際にスコープチェーンを保存します。この関数が呼び出されると、ローカル変数を保存する新しいオブジェクトを作成し、このオブジェクトを保存されたスコープチェーンに追加します。スコープチェーンのフロントエンドは、現在実行されているコードが配置されている環境の常に可変オブジェクトです。スコープチェーンの終わりは、常にグローバル実行環境の可変オブジェクトです。スコープチェーンの目的は、実行環境へのアクセス許可を持つすべての変数と関数がアクセスできるようにすることです。
var scope = 'global scope'; function checkscope(){var scope = 'local scope'; function f(){return scope}; return f;} checkscope()(); //ローカルスコープ理解:Checkscopeが呼び出されると、関数Fが定義され、Checkscopeスコープチェーンにローカル変数として結合します。したがって、関数Fがどこに呼ばれているとしても、このバインディングはまだ有効であるため、戻り値はローカルスコープです。
var num1 = 1; function outer(){var num2 = 2; console.log(num1 + num2); // 3 function inner(){//ここで、num3、num2、num1 var num3 = 3; console.log(num1 + num2 + num3); // 6} //ここでは、num2、num1()、num3 inenter();} outer(); console.log(num1); // 1、実行環境//ここではnum11のみにアクセスできるようにアクセスできます。スコープチェーン(検索アップ):内部環境はスコープチェーンを介してすべての外部環境にアクセスできますが、外部環境は内部環境の変数や機能にアクセスできません。
var name = 'byron'; function fn(){var name = 'csper'; console.log(name); // casper} fn();環境の内部が多いほど、可変重量が高くなります。
注:VARキーワードで直接宣言されていない変数は、グローバル変数です。たとえば、a = 1が直接宣言されている場合、Aは現時点ではグローバル変数です。
Javscriptエンジンがスコープに入ると、2ラウンドでコードを処理します。最初のラウンドは、変数を初期化します。 2回目のラウンド、コードを実行します
var a = 1; function prison(a){console.log(a); // 1 var a; console.log(a); // 1}刑務所(1);3。関数実行
関数呼び出しが実行環境、最初のプロセス引数に入ると、正式なパラメーター(デフォルト値が未定義です)を初期化し、関数の関数宣言を初期化します。コードが段階的に実行されると、関数の変数宣言が初期化されます(環境に入った後にコードが実行されない場合、値は未定義です)。したがって、関数の初期化順序は、正式なパラメーター、関数宣言、および変数宣言です。上の写真から見ることができます。例を挙げましょう(グローバル環境全体も機能です)。
alert(typeof fn); // function、function declaration in function Alert(typeof fn0); // undefined、変数宣言は事前にfn(){// function expression} var fn0 = function(){// function definition} alert(typeof fn0);