検索
ホームページウェブフロントエンドjsチュートリアルJavaScript での this のソフト バインディングについて説明する記事

そもそもソフトバインディングとは何でしょうか?

いわゆるソフトバインディングは、ハードバインディングに対応する言葉です。ソフトバインディングを詳しく説明する前に、まずハードバインディングについて見てみましょう。 JavaScript では、this のバインディングは動的であり、関数が呼び出される場所によって完全にバインドされます。バインディング ルールだけでも、デフォルト バインディングと暗黙的バインディングが含まれます。 、明示的バインディング、新しいバインディングなど。ハード バインディングは明示的バインディングの一種で、通常は関数 apply()call() を呼び出すか、ES5 で提供される bind() メソッドを呼び出してハード バインディングを実装します。 。

ハードバインディングにはどのような問題があるのでしょうか? なぜソフトバインディングが必要なのでしょうか?

上記の 3 つの方法が良いかどうかに関係なく、(使用する以外にも) 独自のアイデアに従って、この関数を指定したオブジェクトに強制することができます。新しいバインディングを使用してハード バインディングを変更します) (バインディングの外側) ですが、ハード バインディングには問題があり、関数の柔軟性が低下し、ハード バインディングの後は、暗黙的バインディングまたは明示的バインディングを使用できなくなります。この点を修正します。

この場合、ソフト バインディングと呼ばれる実装が表示されます。つまり、ソフト バインディングを通じて、これがデフォルト (非厳密モード) または 未定義 (厳密モード) でグローバル オブジェクトを指さなくなることが期待されますが、 2 つの外側のオブジェクトを指します (これはハード バインディングと同じ効果があります) が、同時に、後で this ポインターを変更するための暗黙的バインディングと明示的バインディングの機能を保持します。

ソフト バインディングの具体的な実装

ここでは、「知らない JavaScript」のソフト バインディングのコード実装を使用します。実装。

if(!Function.prototype.softBind){ 
    Function.prototype.softBind=function(obj){ 
        var fn=this;
        var args=Array.prototype.slice.call(arguments,1);
        var bound=function(){ 
            return fn.apply( (!this||this===(window||global))?obj:this,
            args.concat.apply(args,arguments));
            };
        bound.prototype=Object.create(fn.prototype);
        return bound;
        };
}

ソフトバインディングが有効になっていることがわかります。

softBind()

の実装を詳しく見てみましょう。

1行目では、まず関数のプロトタイプに

softBind()

メソッドが無い場合はそれを追加し、Array.prototype.slice.call(arguments)を通して外部からの情報を取得します。 ,1) パラメーター。これは実際には関数のカリー化の目的で行われます。つまり、ソフト バインディング中に事前にいくつかのパラメーターを設定し、関数の呼び出し時に他のパラメーターを渡すことができます (検索に移動できます)詳細な説明についてはオンラインで) 最後に、クロージャを形成するために

bound

関数が返されます。この時点で、関数が softBind() を呼び出した後、得られるのは、上記の var などの bound 関数です。 fooOBJ=foo.softBind (obj1) bound 関数では、ソフト バインディングを呼び出した後の関数 (fooOBJ など) の呼び出し位置、または !this (this が未定義を指す) または this=== の場合は this のポイントを最初に決定します。 (window ||global) (これはグローバル オブジェクトを指します)、次に、関数の this を、softBind で渡されたパラメーター obj にバインドします。この時点で undefind またはグローバル オブジェクトを指していない場合は、これを現在指している関数にバインドします (つまり、暗黙的バインディングまたは明示的バインディング)。 fn.apply の 2 番目のパラメータは、foo を実行するために必要なパラメータで、上記の args (外部パラメータ) と内部引数 (内部パラメータ) によって接続されます。これが、前述のカリー化です。 実際、この関数を初めて読んだとき、var fn=this という文など、foo が foo.softBind() を介して SoftBind を呼び出すとき、誰が fn を指すのか、少し混乱しました。に? foo または SoftBind を指しているのでしょうか?デモ テストを作成すると、fn が何を指しているのかが明確にわかります:

function foo(){
    console.log("name: "+this.name);
    }
var obj1={name:"obj1"},
obj2={name:"obj2"},
obj3={name:"obj3"};
var fooOBJ=foo.softBind(obj1);
fooOBJ();//"name: obj1" 在这里软绑定生效了,成功修改了this的指向,将this绑定到了obj1上1
obj2.foo=foo.softBind(obj1);
obj2.foo();//"name: obj2" 在这里软绑定的this指向成功被隐式绑定修改了,绑定到了obj2上
fooOBJ.call(obj3);//"name: obj3" 在这里软绑定的this指向成功被硬绑定修改了,绑定到了obj3上
setTimeout(obj2.foo,1000);//"name: obj1"18 
/*
*回调函数相当于一个隐式的传参,如果没有软绑定的话,这里将会应用默认绑定将this绑定到全局环
*境上,但有软绑定,这里this还是指向obj1
*/
fn (または this) のポインティングが、依然として this のバインド ルールに従っていることがわかります。

softBind

関数は次のとおりです。で定義されている関数

Function.prototype

のプロトタイプはありますが、JavaScriptの関数は(Javaなど他の言語のクラスで定義されたメソッドとは異なり)オブジェクトに「属する」ことはなく、単に関数がオブジェクトに「属する」というだけです。オブジェクト内で内部参照されているので渡されます。 以下の 2 つの方法で呼び出すと、fn (または this) がそれぞれ

foo

Function.prototype に暗黙的にバインドされるため、それぞれ 3 と 4 が出力されます。次の fn.apply()foo.apply() と同等です。

以上がJavaScript での this のソフト バインディングについて説明する記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

JavaScriptをインストールするにはどうすればよいですか?JavaScriptをインストールするにはどうすればよいですか?Apr 05, 2025 am 12:16 AM

JavaScriptは、最新のブラウザにすでに組み込まれているため、インストールを必要としません。開始するには、テキストエディターとブラウザのみが必要です。 1)ブラウザ環境では、タグを介してHTMLファイルを埋め込んで実行します。 2)node.js環境では、node.jsをダウンロードしてインストールした後、コマンドラインを介してJavaScriptファイルを実行します。

クォーツでタスクが開始される前に通知を送信する方法は?クォーツでタスクが開始される前に通知を送信する方法は?Apr 04, 2025 pm 09:24 PM

Quartzタイマーを使用してタスクをスケジュールする場合、Quartzでタスク通知を事前に送信する方法、タスクの実行時間はCron式によって設定されます。今...

JavaScriptでは、コンストラクターのプロトタイプチェーンで関数のパラメーターを取得する方法は?JavaScriptでは、コンストラクターのプロトタイプチェーンで関数のパラメーターを取得する方法は?Apr 04, 2025 pm 09:21 PM

JavaScriptプログラミング、プロトタイプチェーンの関数パラメーターの理解と操作のJavaScriptのプロトタイプチェーンの関数のパラメーターを取得する方法は、一般的で重要なタスクです...

WeChat MiniプログラムWebViewでVUE.JSダイナミックスタイルの変位が失敗した理由は何ですか?WeChat MiniプログラムWebViewでVUE.JSダイナミックスタイルの変位が失敗した理由は何ですか?Apr 04, 2025 pm 09:18 PM

WeChatアプレットWeb-ViewでVue.jsを使用する動的スタイルの変位障害がvue.jsを使用している理由の分析...

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SublimeText3 中国語版

SublimeText3 中国語版

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