目次
2. 暗黙的なバインディング/損失
3. バインディングの表示
ハード バインディング
ソフト バインディング
4. 新しいバインディング
ホームページ ウェブフロントエンド jsチュートリアル ECMA Javascript についての深い理解 (例付き)

ECMA Javascript についての深い理解 (例付き)

Nov 24, 2018 pm 02:05 PM
css html5 javascript

この記事では、ECMA Javascript について詳しく説明します (例を示します)。必要な方は参考にしていただければ幸いです。

これは実際には、関数が呼び出されたときに発生するバインディングです。それが何を指すかは、関数が呼び出される場所 (つまり、関数がどのように呼び出されるか) によって決まります。

4 つのルール: (知らない JS)

1. デフォルトのバインディング

function foo() {
    console.log( this.a );
}
var a = 2;
foo(); // 2
ログイン後にコピー

厳密かどうかモードでは、グローバル実行コンテキスト (関数本体の外側) で、これはグローバル オブジェクトを参照します。 (MDN)
厳密モー​​ドでは、実行コンテキストに入ったときにその値が保持されます。これが実行コンテキストによって定義されていない場合は、未定義のままになります。 (MDN)

function foo() {
    "use strict";
    console.log( this.a );
}
var a = 2;
foo(); // TypeError: this is undefined
ログイン後にコピー

2. 暗黙的なバインディング/損失

関数がオブジェクト内のメソッドとして呼び出される場合、this は関数を呼び出すオブジェクトであり、バインディングは影響を受けるだけです。最も近いメンバー参照の。 (MDN)

//隐式绑定
function foo() {
    console.log( this.a );
}
var obj2 = {
    a: 42,
    foo: foo
};
var obj1 = {
    a: 2,
    obj2: obj2
};
obj1.obj2.foo(); // 42
ログイン後にコピー
//隐式丢失
function foo() {
    console.log( this.a );
}
function doFoo(fn) {
    // fn 其实引用的是 foo
    fn(); // <-- 调用位置!
}
var obj = {
    a: 2,
    foo: foo
};
var a = "oops, global"; // a 是全局对象的属性
doFoo( obj.foo ); // "oops, global"
ログイン後にコピー

3. バインディングの表示

this の値をあるコンテキストから別のコンテキストに渡す場合は、call メソッドまたは apply メソッドを使用する必要があります。 (MDN)
f.bind(someObject) を呼び出すと、f と同じ関数本体とスコープを持つ関数が作成されますが、この新しい関数では、この関数がどのような方法であっても、これは永続的にバインドの最初のパラメーターにバインドされます。と呼ばれます。

var obj = {
    count: 0,
    cool: function coolFn() {
    if (this.count < 1) {
        setTimeout( function timer(){
            this.count++; // this 是安全的
                            // 因为 bind(..)
            console.log( "more awesome" );
            }.bind( this ), 100 ); // look, bind()!
        }
    }
};
obj.cool(); // 更酷了。
ログイン後にコピー

ハード バインディング

すべてのパラメータを渡し、受け取ったすべての値を返すラッパー関数を作成します。
ハード バインディングを使用すると、関数の柔軟性が大幅に低下します。ハード バインディングを使用した後は、暗黙的バインディングまたは明示的バインディングを使用してこれを変更することはできません。

// 简单的辅助绑定函数
function bind(fn, obj) {
    return function() {
        return fn.apply( obj, arguments );
    };
}
ログイン後にコピー

ソフト バインディング

デフォルト バインディングにグローバル オブジェクトと未定義以外の値を指定すると、暗黙的バインディングまたは明示的バインディングの機能を維持しながらハード バインディングと同じ効果を実現できます。これを変更するバインディングの。

Function.prototype.softBind = function(obj) {
    var fn = this;
    var curried = [].slice.call( arguments, 1 );// 捕获所有 curried 参数
    var bound = function() {
        return fn.apply(
            (!this || this === (window || global))?obj : this
            curried.concat.apply( curried, arguments )
        );
    };
    bound.prototype = Object.create( fn.prototype );
    return bound;
};
ログイン後にコピー

4. 新しいバインディング

関数がコンストラクターとして使用される場合 (new キーワードを使用)、this は構築される新しいオブジェクトにバインドされます。 (MDN)
new を使用して関数を呼び出すか、コンストラクター呼び出しが発生すると、次の操作が自動的に実行されます (不明な JS)

  1. Create (または構築) 完全に新しいオブジェクト。

  2. この新しいオブジェクトは、[[ プロトタイプ ]] を実行することで接続されます。

  3. この新しいオブジェクトは、関数呼び出しの this にバインドされます。

  4. 関数が他のオブジェクトを返さない場合、新しい式の関数呼び出しは自動的にこの新しいオブジェクトを返します。

function foo(a) {
    this.a = a;
}
var bar = new foo(2);
console.log( bar.a ); // 2
ログイン後にコピー

4 つのルールの優先順位

新しいバインディング>暗黙的なバインディング

  1. 関数は新しい(新しいバインディング)で呼び出されますか?そうである場合、これは新しく作成されたオブジェクトにバインドされます。

     var bar = new foo()
    ログイン後にコピー
  2. 関数は呼び出し、適用 (明示的バインディング)、またはハード バインディングによって呼び出されますか?そうである場合、これは指定されたオブジェクトにバインドされます。
    さらに: バインディングが null または未定義の場合、実際にはデフォルトのバインディング ルールが適用されます。

     var bar = foo.call(obj2)
    ログイン後にコピー
  3. 関数はコンテキスト オブジェクトで呼び出されますか (暗黙的にバインドされています)?そうである場合、これはそのコンテキスト オブジェクトにバインドされます。

     var bar = obj1.foo()
    ログイン後にコピー
  4. どちらでもない場合は、デフォルトのバインディングを使用します。厳密モードの場合は unknown にバインドされ、それ以外の場合はグローバル オブジェクトにバインドされます。

     var bar = foo()
    ログイン後にコピー

    その中には次のものが含まれます: 間接参照関数にはデフォルトのバインディング ルールが適用されます

    function foo() {
        console.log( this.a );
    }
    var a = 2;
    var o = { a: 3, foo: foo };
    var p = { a: 4 };
    o.foo(); // 3
    (p.foo = o.foo)(); // 2
    ログイン後にコピー

Exceptions

##1. アロー関数

アロー関数は、この 4 つの標準ルールを使用しませんが、外部 (関数またはグローバル) スコープに基づいてこれを決定します。

アロー関数では、これはそれを囲む字句コンテキストの this と一致します。 (MDN)
アロー関数は、(this が何にバインドされているかに関係なく) 外部関数呼び出しの this バインディングを継承します。これは実は self = this と同じ仕組みです。
アロー関数のバインディングは変更できません。

2.nodejs

setTimeout(function() { 
    console.log(this) 
    //浏览器中:window 
    //nodejs中:Timeout实例
}, 0)
ログイン後にコピー

その他の説明

https://www.zhihu.com/questio...

func(p1, p2) は
func.call(unknown, p1, p2) と同等です

obj.child.method(p1, p2) は

obj.child と同等です.method.call(obj.child, p1, p2)

渡したコンテキストが null または未定義の場合、ウィンドウ オブジェクトがデフォルト コンテキストになります (厳密モードのデフォルト コンテキストは未定義です)

    var number = 50;
    var obj = {
        number: 60,
        getNum: function () {
        var number = 70;
        return this.number;
    }
    }; 

    alert(obj.getNum());
    alert(obj.getNum.call());
    alert(obj.getNum.call({number:20}));
ログイン後にコピー

以上がECMA Javascript についての深い理解 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ブートストラップボタンの使用方法 ブートストラップボタンの使用方法 Apr 07, 2025 pm 03:09 PM

ブートストラップボタンの使用方法は?ブートストラップCSSを導入してボタン要素を作成し、ブートストラップボタンクラスを追加してボタンテキストを追加します

ブートストラップのサイズを変更する方法 ブートストラップのサイズを変更する方法 Apr 07, 2025 pm 03:18 PM

Bootstrapの要素のサイズを調整するには、次のものを含むDimensionクラスを使用できます。

ブートストラップの日付を表示する方法 ブートストラップの日付を表示する方法 Apr 07, 2025 pm 03:03 PM

回答:ブートストラップの日付ピッカーコンポーネントを使用して、ページで日付を表示できます。手順:ブートストラップフレームワークを紹介します。 HTMLで日付セレクター入力ボックスを作成します。ブートストラップは、セレクターにスタイルを自動的に追加します。 JavaScriptを使用して、選択した日付を取得します。

ブートストラップにスプリットラインを書く方法 ブートストラップにスプリットラインを書く方法 Apr 07, 2025 pm 03:12 PM

ブートストラップスプリットラインを作成するには2つの方法があります。タグを使用して、水平方向のスプリットラインを作成します。 CSS Borderプロパティを使用して、カスタムスタイルのスプリットラインを作成します。

ブートストラップに写真を挿入する方法 ブートストラップに写真を挿入する方法 Apr 07, 2025 pm 03:30 PM

ブートストラップに画像を挿入する方法はいくつかあります。HTMLIMGタグを使用して、画像を直接挿入します。ブートストラップ画像コンポーネントを使用すると、レスポンシブ画像とより多くのスタイルを提供できます。画像サイズを設定し、IMG-Fluidクラスを使用して画像を適応可能にします。 IMGボーダークラスを使用して、境界線を設定します。丸い角を設定し、IMGラウンドクラスを使用します。影を設定し、影のクラスを使用します。 CSSスタイルを使用して、画像をサイズ変更して配置します。背景画像を使用して、背景イメージCSSプロパティを使用します。

ブートストラップのフレームワークをセットアップする方法 ブートストラップのフレームワークをセットアップする方法 Apr 07, 2025 pm 03:27 PM

Bootstrapフレームワークをセットアップするには、次の手順に従う必要があります。1。CDNを介してブートストラップファイルを参照してください。 2。独自のサーバーでファイルをダウンロードしてホストします。 3。HTMLにブートストラップファイルを含めます。 4.必要に応じてSASS/LESSをコンパイルします。 5。カスタムファイルをインポートします(オプション)。セットアップが完了したら、Bootstrapのグリッドシステム、コンポーネント、スタイルを使用して、レスポンシブWebサイトとアプリケーションを作成できます。

ブートストラップの日付を確認する方法 ブートストラップの日付を確認する方法 Apr 07, 2025 pm 03:06 PM

ブートストラップの日付を確認するには、次の手順に従ってください。必要なスクリプトとスタイルを紹介します。日付セレクターコンポーネントを初期化します。 Data-BV-Date属性を設定して、検証を有効にします。検証ルール(日付形式、エラーメッセージなどなど)を構成します。ブートストラップ検証フレームワークを統合し、フォームが送信されたときに日付入力を自動的に検証します。

ブートストラップナビゲーションバーの設定方法 ブートストラップナビゲーションバーの設定方法 Apr 07, 2025 pm 01:51 PM

ブートストラップは、ナビゲーションバーをセットアップするための簡単なガイドを提供します。ブートストラップライブラリを導入してナビゲーションバーコンテナを作成するブランドアイデンティティの作成ナビゲーションリンクの作成他の要素の追加(オプション)調整スタイル(オプション)

See all articles