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 について
Linux が NFS サーバーを構築異なるオペレーティング システム間でデータを共有するために、通...
この記事では、宝くじターンテーブルを描画するJS + Canvasの具体的なコードを参考までに共有し...
目次1. 基本的な使い方とロジック2. 特徴3. エラーオブジェクト4. キャッチアンドスロー戦略の...
1. 約束の説明Promise は、非同期操作の最終状態 (失敗または正常完了) とその結果の値を...
入力ボックス内のカーソルのサイズが一定ではありませんIE7とChromeの違いは非常に明白ですまず、...
目次ショートポーリングロングポーリングウェブソケットコミュニケーションの原則シンプルな1対1チャット...
目次アプリ更新プロセス大まかなフローチャートアプリ情報の更新1. まず取得する必要があるファイルアド...
MySql 8.0 対応ドライバパッケージのマッチングMySql データベースをバージョン 8.0 ...
MySQL で使用される自動インクリメント ID には多くの種類があり、各自動インクリメント ID ...
目次Tomcat クラスローダー階層WebAppクラスローダー共有クラスローダーカタリナクラスローダ...
この記事では、centos7 環境でバイナリ インストール パッケージを使用して mysql5.6 ...
機能: データ表示、テーブルアプリケーションシナリオ。 <table> テーブル<...
Bashで配列を定義するbash スクリプトで新しい配列を作成する方法は 2 つあります。 1 つ目...
目次1. 異なるビューポートを取得する方法2. 水平画面と垂直画面のJavaScript検出3. 水...
コード <div class="test"> <div>...