これは以下を指します: 1. 通常の関数またはオブジェクト属性として、ウィンドウ オブジェクトを指します; 2. イベント バインディング内で、バインドされたイベントの要素を指します; 3. コンストラクター内で、クラスのインスタンス; 4. 矢印 関数では、最も近い親コンテキストで this を指します; 5. call/apply/bind では、渡された最初のパラメーターを指します。
このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター
JavaScript
中this
次の状況を指します:
- 通常の関数またはオブジェクト属性として
- イベント バインディング
- コンストラクター
- Arrow function
-
call/apply/bind
Specify
一つずつ紹介しましょう
通常の関数またはオブジェクト属性として
this
は、メソッドの実行前に「ドット」があるかどうかによって決まります。「ドット」がある場合は、その「ドット」の前にいる人が決まります。 this になります。ドットがない場合、
this は
window
const fn = function () { console.log(this); }; const obj = { name: 'OBJ', fn }; fn(); obj.fn(); const fn1 = obj.fn; fn1();answer:
1. window 2. {name: 'OBJ', fn: function() {console.log(this)}} // obj 3. windowを指します。関数はオブジェクトのプロパティとして呼び出されます。その
this は関数を呼び出したオブジェクトを指します。それ以外の場合、その
this は
window を指します。
イベント バインディング
イベント バインディングを実行する場合、イベント バインディング関数のthis はバインディング イベントの要素です:
// 假设页面中有id为button的button元素 // var x = 100; window.x = 100; const fn = function () { console.log(this.x); }; const obj = { x: 200, fn }; const $button = document.getElementById('button'); $button.x = 300; obj.fn(); const fn1 = obj.fn; fn1(); $button.addEventListener('click', fn); $button.addEventListener('mouseenter', obj.fn); $button.addEventListener('mouseleave', function () {obj.fn();});answer :
1. 200 2. 100 3. 点击button时:300 4. 鼠标移入button时:300 5. 鼠标移出时:200しかし、注意する必要があります。ここでは、ユーザーがクリックすると、ブラウザーがクリック イベントの
this を
DOM# にポイントするのに役立ちます。 ## イベントにバインドされた要素。対応するイベントがコードを通じてトリガーされる場合は、call/apply/bind
( new Fn#) を通じてその
this
$button.click.call() // this为window,打印结果为100
コンストラクターを指定できます。 ##)
コンストラクター (new Fn
) が実行されます。関数内の this は、現在のクラス (
です) のインスタンスです。 new キーワードは、これを行うのに役立ちます:
var x = 100; const Fn = function () { this.x = 200; console.log(this.x); }; const fn = new Fn();
answer:
1. 200
arrow function
矢印には独自の ## がありません関数 #this、使用される
this は、最も近い親コンテキスト の
this
const fn = function () { console.log(this); setTimeout(() => { console.log(this); }, 1000); setTimeout(function () { console.log(this); }); }; const obj = { x: 100, fn }; obj.fn();
answer:
1. {x:100, fn: function() {...}} // obj 2. window 3. {x:100, fn: function() {...}} // obj## です。 #call/apply/bindthis
を変更して、call/apply/bind に渡される最初のパラメータとして
を指すようにします。関数の this
: var x = 100; const obj = { x: 200, y: 200 }; const fn = function () { console.log(this.x); }; fn(); fn.call(obj); fn.apply(obj); const fixedThisFn = fn.bind(obj); fixedThisFn();
answer:
1. 100 2. 200 3. 200 4. 200
call実行時の最初のパラメータは
this- がポイントし、後続のパラメータは
- fn
実行時のパラメータ
apply
実行時、最初のパラメータは
this がポイント, 後続のパラメータは、 - fn
実行時のパラメータで構成される配列です。配列内の各項目は、
fnbind ## の各パラメータに対応します。 #実行時、最初のパラメータは事前に
this
に渡されたポインタ、以降のパラメータは実際に fn - を呼び出す前に渡されたパラメータで、戻り値はfunction
fixedThisFn
、fixedThisFn
は内部でfn
を呼び出し、そのthis
がを指すように指定します。より深い理解
call/apply/bindは、関数内で
this が指すものをどのように変更しますか? 以下では、これら 3 つの関数をシミュレートして実装します
call/apply/bind
ソース コードの実装
前の紹介によると、関数がオブジェクト プロパティとして呼び出されるとき、this は関数を呼び出すオブジェクト
const obj = { x: 100, fn () {console.log(this);} };
obj.fn(); // {x: 100, fn: function() {...}} => obj
JavaScript のこの機能を使用すると、実行された関数を call/ の最初のパラメーター
context
を実行し、context
を渡します。この属性に対応する関数を呼び出すには、関数の this
が context
## を指します。
#call ソース コードのシミュレーションは次のとおりです。
Function.prototype.myOwnCall = function (context, ...args) { const uniqueKey = new Date().getTime(); // this为调用call方法的函数 context[uniqueKey] = this; // 作为对象的方法被对象调用,this指向该对象context const result = context[uniqueKey](...args); delete context[uniqueKey]; return result; };
この時点で、
context が call/ に渡されたらどうなるかに気付いた友人もいるかもしれません。 apply はオブジェクトではありませんか?
mdn による
call メソッドの最初のパラメーターの説明を見てみましょう:
function.call( thisArg 、 arg1、 arg2、 ...) *
thisArg
functionメソッドでこの関数を呼び出します。関数の実行時に使用される
this
値。this
は、このメソッドで表示される実際の値ではない可能性があることに注意してください。この関数が非厳密モードの場合、
の場合は、null
またはunknown
になります。指定すると、グローバル オブジェクトを指すように自動的に置き換えられ、元の値がラップされます。次に、
myOwnCallメソッドの最初のパラメーターを次のように処理します。
function translateToObject (context) { // 可以通过 == 进行判断 context == null // null == undefined => 2个等号是成立的 // null,undefined => window if (typeof context === 'undefined' || context === null) { context = window; } else if (typeof context === 'number') { // 原始值转换为包装对象 context = new Number(context); } else if (typeof context === 'string') { context = new String(context); } else if (typeof context === 'boolean') { context = new Boolean(context); } return context; }は、
myOwnCall
Function.prototype.myOwnCall = function (context, ...args) { context = translateToObject(context); const uniqueKey = new Date().getTime(); // this为调用call方法的函数 context[uniqueKey] = this; // 作为对象的方法被对象调用,this指向该对象context const result = context[uniqueKey](...args); delete context[uniqueKey]; return result; };
apply の実装は、基本的に call# と同じです。 ## (2 番目を除く) パラメーターは配列です: <pre class='brush:php;toolbar:false;'>Function.prototype.myOwnBind = function (context, paramsArray) {
context = translateToObject(context);
const uniqueKey = new Date().getTime();
// this为调用call方法的函数
context[uniqueKey] = this;
// 作为对象的方法被对象调用,this指向该对象context
const result = context[uniqueKey](...paramsArray);
delete context[uniqueKey];
return result;
};</pre><p>相比于<code>call/apply
,bind
函数并没有立即执行函数,而是预先传入函数执行时的this
和参数,并且返回一个函数,在返回的函数中执行调用bind
函数并将预先传入的this
和参数传入
bind
的源码模拟:
Function.prototype.myOwnBind = function (context, ...outerArgs) { const fn = this; return function (...innerArgs) { return fn.call(context, ...outerArgs, ...innerArgs); }; };
精简版如下:
Function.prototype.myOwnBind = (context, ...outerArgs) => (...innerArgs) => this.call(context, ...outerArgs, ...innerArgs);
这里并没有实现通过new
操作符来执行fn.bind(context)
的操作,如果想知道其详细的实现过程,可以看我的这篇文章: JS进阶-手写bind
在深入理解call/apply/bind
的实现原理后,我们尝试完成下面的测试:
function fn1 () {console.log(1);} function fn2 () {console.log(2);} fn1.call(fn2); fn1.call.call(fn2); Function.prototype.call(fn1); Function.prototype.call.call(fn1);
answer:
1. 1 2. 2 3. 什么都不输出 4. 1
这里我们根据call
的源码来进行推导一下Function.prototype.call.call(fn1)
,其它的执行过程类似:
// 1. 首先会将Function.prototype.call作为一个函数来执行它原型上的call方法 // 所以call方法内部: // this => Function.prototype.call // context => fn1 // 通过对象的属性来执行方法改变this指向 // fn1[uniqueKey] = this(Function.prototype.call) // fn1[uniqueKey]() // 执行 Function.prototype.call方法,但是this是context // 2. 在this为fn1的情况下执行Function.prototype.call方法 // 所以call方法内部: // this => fn1 // context => window // 通过对象的属性来改变this指向 // window[uniqueKey] = fn1 // window[uniqueKey]() // 执行fn1(),但是this是window
更多编程相关知识,请访问:编程入门!!
以上がJavaScript はどこを指しているのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

Dreamweaver Mac版
ビジュアル Web 開発ツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません
