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 について
目次Django でのタイムゾーン設定USE_TZ=真USE_TZ=偽Linux コンテナでのタイム...
ジェネレータとは何ですか?ジェネレーターは関数内で実行されるコードです。値を返した後、一時停止し、呼...
プロジェクトで使用されている特殊文字とアイコンHTMLコードXML/HTML コードコンテンツをクリ...
binlog は、MySQL のすべての DML 操作を記録するバイナリ ログ ファイルです。 bi...
1. 背景Netplan は、Ubuntu システムのネットワーク設定を簡単に管理および構成できるよ...
この記事では、Vueを使用してショッピングカートの数量を変更する方法を紹介します。具体的な内容は次の...
H5 レイアウトを設計する場合、通常はバナーに遭遇することになります。例えば、2:1 で表示したい場...
MySQL では、1 つの列に複数のインデックスを作成できます。意図的であるかどうかにかかわらず、M...
目次1. ルーティングアニメーション2. グループクエリとスタガー1. ルーティングアニメーションル...
1. ノードサーバーのセットアップ + データベース接続ここでの操作は比較的簡単でわかりやすいです。...
mysql のデフォルトのストレージ ディレクトリは/var/lib/mysql/です。以下は、デフ...
今日午後ずっと私を悩ませたバグを記録する半月前から始めましょう。それから.................
1. 前提条件何度かインストールしているので、エラーについてはこれ以上説明しません。ちょっとわかりに...
公式サイトから mysql-5.7.19-winx64 をダウンロードします。これはシステムの 64...
この記事は主に、nginx を介して方向プロキシを実装するプロセスを紹介します。この記事のサンプル ...