JavaScript でこれを包括的に分析

Nov 30, 2017 am 10:41 AM
javascript js this

JavaScriptオブジェクトはもちろん、 this キーワードが不可欠です!このキーワードJavaScriptを使用すると、コードが削減されます。今日はこれをJavaScriptで分析します。

暗黙的なバインディング

これについて、一般的に言えば、メソッドを呼び出す人は誰でも、このメソッドが指す人を次のように指します:

function foo(){
    console.log(this.a)
}
var a = 3;
var obj = {
    a: 2,
    foo: foo
};
obj.foo(); // 输出2,因为是obj调用的foo,所以foo的this指向了obj,而obj.a = 2
ログイン後にコピー

複数の呼び出しがある場合、オブジェクトプロパティ参照チェーンのみ上位層または最後の層は、呼び出し位置で次のような役割を果たします。

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

暗黙的な損失


このバインディングで最も一般的な問題の 1 つは、暗黙的にバインドされた関数が失われることです。 オブジェクトをバインドします。これは、デフォルトのバインディングを適用する必要があることを意味し、厳密モードかどうかに応じて、これをグローバル オブジェクトまたは未定義のオブジェクトにバインドします。

function foo() {
    console.log( this.a )
}
var obj1 = {
    a: 2,
    foo: foo
}
var bar = obj1.foo; // 函数别名!
var a = "oops, global"; // a是全局对象的属性
bar(); // "oops, global"
ログイン後にコピー

barはobj.fooへの参照ですが、実際にはfoo関数そのものを参照しているため、このときのbar()は実際には何も変更せずに関数呼び出しとなっているため、デフォルトのバインディングが適用されます

A more コールバック関数を渡すときに、微妙でよくある予期せぬ状況が発生します:

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"
ログイン後にコピー

パラメータの受け渡しは、実際には暗黙的な代入の一種であるため、関数を渡すと暗黙的に代入されるため、結果は同じになります前の例のように、関数が自分で宣言した関数 (setTimeout など) の代わりに言語の組み込み関数に渡された場合も、結果は同じになります

put は、call、apply、bind、new binding などを指定することです。

ハードバインディング

function foo( something ) {
    console.log( this.a, something)
    return this.a + something
}
var obj = {
    a: 2
}
var bar = function() {
    return foo.apply( obj, arguments)
}
var b = bar(3); // 2 3
console.log(b); // 5
ログイン後にコピー

ここで簡単に説明します: bar 関数では、foo は apply 関数を使用して obj をバインドします。つまり、foo の This は obj を指します。同時に、引数 (渡されるパラメータの数に制限はありません) がパラメータとして使用され、foo 関数に渡されます。そのため、bar(3) を実行するときは、obj. a が最初に出力され、2 と 3 が渡され、その後 foo は 2 つの合計を返すため、b の値は 5 になります

同様に、この例では、bind:

function foo( something ) {
    console.log( this.a, something)
    return this.a + something
}
var obj = {
    a: 2
}
var bar = foo.bind(obj)
var b = bar(3); // 2 3
console.log(b); // 5
ログイン後にコピー

を使用することもできます。従来のnew binding

クラス指向言語では、newを使ってクラスを初期化する際、クラス内のコンストラクタが呼び出されますが、JSのnewの仕組みは実はクラスの仕組みとは全く異なります。 -指向と言語指向。

new を使用して関数を呼び出すか、コンストラクターの呼び出しが発生すると、次の操作が自動的に実行されます: 新しいオブジェクトを作成 (または構築) します

この新しいオブジェクトは [[プロトタイプ]] 接続で実行されます

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

関数が他のオブジェクトを返さない場合、new

expression

の関数は、次のようなこの新しいオブジェクトを自動的に返します:

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

new を使用して呼び出した場合foo(...) の場合、新しいオブジェクトを構築し、 foo(...) 呼び出しでこれにバインドします。 new は、関数が呼び出されたときにこのバインディングの動作に影響を与えることができる最後のメソッドです。これを新しいバインディングと呼びます。

これは

の優先順位です

デフォルトのバインディングの優先順位が 4 つのルールの中で最も低いことは間違いないため、最初は無視できます。

暗黙的バインディングと明示的バインディングではどちらが優先されますか?テストしてみましょう:

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

明示的なバインディングの優先順位が高いことがわかります。これは、判断を下す際に、明示的なバインディングが存在できるかどうかを最初に考慮する必要があることを意味します。

ここで、新しいバインディングと暗黙的バインディングの間でどちらの優先度が高く、どちらの優先度が低いかを判断する必要があります:

function foo(something){
    this.a = something
}
var obj1 = {
    foo: foo
}
var obj2 = {}
obj1.foo(2); 
console.log(obj1.a); // 2
obj1.foo.call(obj2,3);
console.log(obj2.a); // 3
var bar = new obj1.foo(4)
console.log(obj1.a); // 2
console.log(bar.a); // 4
ログイン後にコピー

新しいバインディングの優先度が暗黙的バインディングよりも高いことがわかります。しかし、新しいバインディングと明示的なバインディングではどちらの方が優先されるのでしょうか?

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

新しいバインディングはハード バインディングでこれを変更するため、新しいバインディングは明示的なバインディングよりも高い優先順位を持っていることがわかります。

new でハードバインド関数を使用する主な目的は、関数の一部のパラメーターを事前に設定して、new で初期化するときに残りのパラメーターのみを渡すことができるようにすることです。 bind(...) の機能の 1 つは、最初のパラメーター (最初のパラメーターはこれをバインドするために使用されます) を除くすべてのパラメーターを基礎となる関数に渡すことができることです (この手法は「部分アプリケーション」と呼ばれ、一種のアプリケーションです)。 「カレー」)。例:

function foo(p1,p2){
    this.val = p1 + p2;
}
// 之所以使用null是因为在本例中我们并不关心硬绑定的this是什么
// 反正使用new时this会被修改
var bar = foo.bind(null,&#39;p1&#39;);
var baz = new bar(&#39;p2&#39;);
baz.val; // p1p2
}
ログイン後にコピー

カリー化: カリー化は直感的に、「いくつかのパラメーターを修正すると、残りのパラメーターを受け入れる関数が得られる」と述べています。したがって、2 つの変数を持つ関数 yx の場合、y = 2 が固定されている場合、1 つの変数を持つ関数 2x が得られます

アロー関数のこのアプリケーション

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

我们来看一下箭头函数的词法作用域:

function foo() {
    // 返回一个箭头函数
    return (a) => {
        // this继承自foo()
        console.log(this.a)
    };
}
var obj1 = {
    a: 2
};
var obj2 = {
    a: 3
};
var bar = foo.call(obj1);
bar.call(obj2); // 2, 不是3!
ログイン後にコピー

foo()内部创建的箭头函数会捕获调用时foo()的this。由于foo()的this绑定到obj1,bar(引用箭头函数)的this也会绑定到obj1,箭头函数的绑定无法被修改。(new也不行!)

总结

如果要判断一个运行中的函数的this绑定,就需要找到这个函数的直接调用位置。找到之后就可以顺序应用下面这四条规则来判断this的绑定对象。

由new调用?绑定到新创建的对象。

由call或者apply(或者bind)调用?绑定到指定的对象。

由上下文对象调用?绑定到那个上下文对象。

默认:在严格模式下绑定到undefined,否则绑定到全局对象。

相关推荐:

JavaScript学习笔记之基础语法

JavaScript 是真正的 OOP 语言吗?

如何用JavaScript修改伪类样式

以上が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)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

推奨: 優れた JS オープンソースの顔検出および認識プロジェクト 推奨: 優れた JS オープンソースの顔検出および認識プロジェクト Apr 03, 2024 am 11:55 AM

顔の検出および認識テクノロジーは、すでに比較的成熟しており、広く使用されているテクノロジーです。現在、最も広く使用されているインターネット アプリケーション言語は JS ですが、Web フロントエンドでの顔検出と認識の実装には、バックエンドの顔認識と比較して利点と欠点があります。利点としては、ネットワーク インタラクションの削減とリアルタイム認識により、ユーザーの待ち時間が大幅に短縮され、ユーザー エクスペリエンスが向上することが挙げられます。欠点としては、モデル サイズによって制限されるため、精度も制限されることが挙げられます。 js を使用して Web 上に顔検出を実装するにはどうすればよいですか? Web 上で顔認識を実装するには、JavaScript、HTML、CSS、WebRTC など、関連するプログラミング言語とテクノロジに精通している必要があります。同時に、関連するコンピューター ビジョンと人工知能テクノロジーを習得する必要もあります。 Web 側の設計により、次の点に注意してください。

株価分析に必須のツール: PHP と JS を使用してローソク足チャートを描画する手順を学びます 株価分析に必須のツール: PHP と JS を使用してローソク足チャートを描画する手順を学びます Dec 17, 2023 pm 06:55 PM

株式分析に必須のツール: PHP および JS でローソク足チャートを描画する手順を学びます。特定のコード例が必要です。インターネットとテクノロジーの急速な発展に伴い、株式取引は多くの投資家にとって重要な方法の 1 つになりました。株価分析は投資家の意思決定の重要な部分であり、ローソク足チャートはテクニカル分析で広く使用されています。 PHP と JS を使用してローソク足チャートを描画する方法を学ぶと、投資家がより適切な意思決定を行うのに役立つ、より直感的な情報が得られます。ローソク足チャートとは、株価をローソク足の形で表示するテクニカルチャートです。株価を示しています

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

PHP および JS 開発のヒント: 株価ローソク足チャートの描画方法をマスターする PHP および JS 開発のヒント: 株価ローソク足チャートの描画方法をマスターする Dec 18, 2023 pm 03:39 PM

インターネット金融の急速な発展に伴い、株式投資を選択する人がますます増えています。株式取引では、ローソク足チャートは一般的に使用されるテクニカル分析手法であり、株価の変化傾向を示し、投資家がより正確な意思決定を行うのに役立ちます。この記事では、PHP と JS の開発スキルを紹介し、株価ローソク足チャートの描画方法を読者に理解してもらい、具体的なコード例を示します。 1. 株のローソク足チャートを理解する 株のローソク足チャートの描き方を紹介する前に、まずローソク足チャートとは何かを理解する必要があります。ローソク足チャートは日本人が開発した

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

See all articles