Jsでのこれの深い理解
範囲なぜ var a = 1; var s = 関数(){ コンソールにログ出力します。 }; (関数(){ var a = 2; s(); // 1 })(); s() が呼び出されると、a は 1 として出力されます。これは静的スコープです。つまり、スコープは宣言時に指定されます。動的スコープの場合は、ここに 2 が出力されます。現在、 グローバルスコープ最上位レベルで直接宣言された変数またはメソッドは、グローバル スコープで実行されます。スコープを表示するには、関数の 関数 s(){} console.dir(s); /* ... [[スコープ]]: スコープ[1] 0: グローバル... */ // 宣言された s 関数がグローバル スコープで実行されることがわかります。 関数のスコープ関数が宣言されると、関数内で宣言されたメソッドまたはメンバーの動作環境が関数の関数スコープになります。 (関数localContext(){ var a = 1; 関数 s(){ return a; } console.dir(s); })(); /* ... [[スコープ]]: スコープ[2] 0: クロージャ (localContext) {a: 1} 1: グローバル... */ // 宣言された s 関数が実行されるコンテキストは関数のスコープ localContext であり、ローカル スコープとも呼ばれることがわかります。 ブロックスコープコード ブロック内に { a = 1 とします。 関数 s(){戻り値 a;} console.dir(s); /* ... [[スコープ]]: スコープ[2] 0: ブロック {a: 1} 1: グローバル... */ } // 宣言された s 関数がブロック スコープ (ローカル スコープでもある) で実行されることがわかります。 分析する
var obj = { 名前: 1, 言う: function() { this.name を返します。 } }; ウィンドウ名 = 2; ウィンドウを言う = obj.say; コンソールログ(obj.say()); // 1 コンソールログ(window.say()); // 2 この結果の理由は、 使用
デフォルトのバインディング最もよく使われる関数呼び出しタイプは独立関数呼び出しであり、これは最も優先順位が低いものでもあります。このとき、 var a = 1; // グローバルオブジェクト内の変数宣言 function f1() { this.a を返します。 } 関数f2() { 「厳密な使用」; これを返します。 } console.log(f1()); // 1 // 実際にはwindow.f1()を呼び出しており、これは常に呼び出し元、つまりwindowを指します。 console.log(f2()); // undefined // 実際にはwindow.f2()を呼び出します。この時点では、strictモードuse strictのため、関数内のthisはundefinedです。 暗黙のバインディングオブジェクト プロパティ参照チェーンの最上位または最後のレイヤーのみが 関数f(){ コンソールにログ出力します。 } var obj1 = { a: 1、 ファ: ファ }; var obj2 = { 11, オブジェクト1: オブジェクト1 }; obj2.obj1.f(); // 1 // 呼び出し元の最後の層はobj1です 関数f(){ コンソールにログ出力します。 } var obj1 = { a: 1、 ファ: ファ }; var obj2 = { 11, }; obj2.f = obj1.f; // 間接参照 obj2.f(); // 11 // 呼び出し元は obj2 です ディスプレイバインディング関数を特定の環境、つまりオブジェクトに強制的に適用したい場合は、 window.name = "A"; // ウィンドウオブジェクトにマウントされた名前 document.name = "B"; // ドキュメントオブジェクトにマウントされた名前 var s = { // オブジェクト s をカスタマイズする 名前: 「C」 } var ロールコール = { 名前: 「先生」、 sayName: 関数(){ コンソールにログ出力します。 } } rollCall.sayName(); // 先生 // 適用する rollCall.sayName.apply(); // A // パラメータは渡されず、デフォルトのウィンドウがバインドされます rollCall.sayName.apply(window); // A // ウィンドウオブジェクトをバインド rollCall.sayName.apply(document); // B // ドキュメントオブジェクトをバインド rollCall.sayName.apply(s); // C // カスタムオブジェクトをバインド // call rollCall.sayName.call(); // A // パラメータは渡されず、デフォルトのウィンドウがバインドされます rollCall.sayName.call(window); // A // window オブジェクトにバインド rollCall.sayName.call(document); // B // document オブジェクトにバインド rollCall.sayName.call(s); // C // カスタム オブジェクトにバインド // bind // 最後の () は実行用です rollCall.sayName.bind()(); //A // パラメータを渡さずに window にデフォルトでバインド rollCall.sayName.bind(window)(); //A // ウィンドウオブジェクトをバインド rollCall.sayName.bind(document)(); //B // ドキュメントオブジェクトをバインド rollCall.sayName.bind(s)(); // C // カスタムオブジェクトをバインド 新しいバインディング
空のプレーン 関数_new(base,...args){ var obj = {}; obj.__proto__ = base.prototype; ベースを適用します(obj、args); obj を返します。 } 関数Funct(a) { これは、 } var f1 = 新しいFunct(1); コンソールログ(f1.a); // 1 var f2 = _new(関数、1); コンソールログ(f2.a); // 1 矢印関数矢印関数には別の ウィンドウ名 = 1; var obj = { 名前: 11, 言う: function(){ 定数f1 = () => { this.name を返します。 } console.log(f1()); // 11 // 直接の呼び出し元はwindowですが、矢印関数はthisをバインドしないため、コンテキスト内のthis、つまりobjオブジェクトが取得されます。const f2 = function(){ this.name を返します。 } console.log(f2()); // 1 // 直接の呼び出し元は通常の関数 window なので、this.name を返します。 } } console.log(obj.say()); // 11 // 直接の呼び出し元はobjです。実行中の関数内のコンテキストのthisはobjオブジェクトです 例関数s(){ console.log(これを); } // ウィンドウ内で直接呼び出す // 非使用厳密 s(); // ウィンドウ // window.s() と同等、呼び出し元は window // ウィンドウは Window のインスタンスです // window instanceof Window //true // 新しいオブジェクト s1 を作成する var s1 = { t1: function(){ // this が呼び出し元を指していることをテストする console.log(this); // s1 s(); // ウィンドウ // この呼び出しはwindow.s()と同等ですが、呼び出し元はwindowです }, t2: () => { // テスト矢印関数。これは呼び出し元を指していません。console.log(this); }, t3: { // テストオブジェクト内のオブジェクト tt1: function() { console.log(これを); } }, t4: { // 矢印関数と非関数呼び出しをテストします。これは呼び出し元を指していません。tt1: () => { console.log(これを); } }, t5: function(){ // 関数呼び出しをテストする場合、矢印関数の this は前のオブジェクトの呼び出し元を指します。 return { tt1: () => { console.log(これを); } } } } s1.t1(); // s1 オブジェクト // ここでの呼び出し元は s1 なので、出力されるオブジェクトは s1 です s1.t2(); // ウィンドウ s1.t3.tt1(); // s1.t3 オブジェクト s1.t4.tt1(); // ウィンドウ s1.t5().tt1(); // s1 オブジェクト Js での this の詳細な理解に関するこの記事はこれで終わりです。Js での this の詳細な理解に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQL innodb_autoinc_lock_mode について
今日、新しい技を学びました。あまりやったことがなかったので、今まで知りませんでした...目的: リン...
mysqlrootパスワードの設定と変更初めて MySQL データベースに入ります。 !環境変数にm...
目次ライフサイクルを理解する理由ライフサイクルとはライフサイクルフック関数作成され、マウントされたフ...
1. VMware vSphere の概要VMware vSphere は、業界をリードする最も信...
プロジェクトの目的元のWindows環境でphpstudyを使用して構築されたMySQL 5.5.5...
序文div またはモジュールに overflow: scroll 属性を使用すると、iOS フォンで...
この記事では、電子商取引プラットフォームで商品の詳細を表示する一般的な例を紹介します。たとえば、ある...
この記事では、例を使用して、MySQL データベースのデータ テーブルの最適化、外部キーの使用、およ...
目次1. 書き込み可能: 書き込み可能2. 列挙可能: 列挙可能3. 設定可能: 設定可能オブジェク...
docker リポジトリ自体は非常に遅いですが、中国の Alibaba Cloud ミラー リポジト...
序文Nodejs はサーバーサイド言語です。開発中、登録やログインなどでは、判断のためにフォームを通...
1. まずmysqlサービスを停止します管理者としてCMDを開いて閉じるか、Windowsサービスペ...
目次確認する:例の検証と組み合わせるselect クエリ ステートメントはロックされませんが、sel...
コードをコピーコードは次のとおりです。 <object classid="clsid...
コードをコピーコードは次のとおりです。 <span style="font-fami...