ホームページ ウェブフロントエンド jsチュートリアル JavaScript コールバック関数の変数スコープに関するディスカッション_JavaScript スキル

JavaScript コールバック関数の変数スコープに関するディスカッション_JavaScript スキル

May 16, 2016 pm 06:46 PM
javascript 変数スコープ 折り返し電話

1. 背景
Javascript のコールバック関数については誰もがよく知っていると思います。最もわかりやすい例は、Ajax リクエストを行うときに提供されるコールバック関数です。
実際には、DOM ノードのイベント処理メソッド (onclick、 ondblclick など)これもコールバック関数です。
DWR を使用する場合、コールバック関数は次のように最初または最後のパラメータとして指定できます:
JScript code function callBack(result){ } myDwrService.doSomething(param1,param2,callBack);//DWR 推奨method //or myDwrService.doSomething(callBack,param1,param2);

2. 問題の説明
最近 Dojo Dwr を使用しているときに、次の問題が発生しました。
コールバック関数が A メソッドに属している場合オブジェクト (obj1 として記録) に対して、DWR がコールバック関数を実行すると、
コンテキストは obj1 ではありません。
この現象は、コールバック関数でアクセスされる obj1 のプロパティが未定義であるということです。
バージョン: Dojo1.3.1 および dwr2
3. 問題をシミュレートするコード
次のテスト コードでこの問題をシミュレートできます:
JScript コード

コードをコピー コードは次のとおりです:




テスト呼び出し



callObjMethod メソッドでは、「メソッド」メソッドをコールバックする 2 つの方法を使用しました。
最初の方法: method("Callback through the default context");
コンテキストを指定しない場合、次のことがわかりました。コールバック関数内 アクセス コンテキストの値はグローバル変数の値です。
これは、このメソッドを実行するためのデフォルトのコンテキストがグローバル コンテキストであることを意味します。
2 番目のメソッド:method.call(obj, "明示的なオブジェクト コンテキスト コールバックを指定する");
メソッド実行のコンテキストとして obj を指定すると、オブジェクト内のコンテキストにアクセスできます。

4. DWR の調査
2006 年に DOJO DWR (1.0) を使用していたときにすでにこの問題に遭遇していたため、その時はあまり下調べをせず、dwr のソース コードを直接変更しました。
私は現在 dwr2 を使用しているので、DWR にこの問題に対処する新しい方法があるかどうかを確認したいと思いました。
dwr.jar 内の Engine.js を取り出し、コールバック (_remoteHandleCallback と _) に関する関連コードを確認します。実行)、
は、コールバックを処理する方法が 1.0 よりも単純であるようで、オブジェクトとメソッドを一緒に渡す方法がないことがわかりました。
5. さらに調査する
今回のプロジェクトでは DWR が広く使用されており、そのような要求に応える必要があると考えているため、すぐにはソース コードを修正しませんでした。 Google で Dojo dwr を検索しても、Dojo にはあまり多くのユーザーがいないのかもしれません。
そこで、「JavaScript コールバック オブジェクト コンテキスト」を検索し、特に Java コールバック関数の問題を紹介する記事を見つけました。
http://bitstructs.com/2007/11/javascript-method-callbacks
最も重要なこと 文:
関数がオブジェクト (obj.alertVal()) のメソッドとして呼び出される場合、
「this」は呼び出されたオブジェクト (obj) にバインドされます。 >そして、オブジェクト (func()) なしで関数が呼び出される場合、
「this」は JavaScript グローバル オブジェクト (Web ブラウザーのウィンドウ) にバインドされます。
この記事では、次のような解決策も提供します。クロージャと匿名メソッド
JavaScript では、関数内に関数を作成すると、自動的にクロージャが作成されます。
このクロージャは、対応する関数が作成されたときのコンテキストを記憶できます。
次の場合:
JScript コード var ClosureFunc=function(){ testObj.callback(); }
どこにいても、closureFunc() を直接呼び出すことと testObj.callback() を呼び出すことは同じです。 。
詳細については、上記の記事を参照してください: http://bitstructs.com/2007/11/javascript-method-callbacks。
6. シミュレーション コードを改善します
シミュレーション コードには、次のコールバック メソッドを追加します。
JScript コード






コールテスト



8. 2 つの文要約:
クロージャは関数のローカル変数であり、関数が戻った後も生き続けます。
または
クロージャは、関数が戻ったときに割り当てが解除されないスタックフレームです(あたかも関数が戻ったかのように)。 「スタックフレーム」はスタック上にあるのではなく、malloc されていました!)
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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 を使用してオンライン音声認識システムを実装する方法を紹介します。

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

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

PHP関数の変数スコープはどのように決定されるのでしょうか? PHP関数の変数スコープはどのように決定されるのでしょうか? Apr 16, 2024 pm 04:51 PM

PHP の変数スコープは、ローカル (関数内)、グローバル (プログラム内でアクセス可能)、クラス スコープ (クラス インスタンス内でアクセス可能) に分かれています。 global キーワードはローカル変数をグローバル変数として宣言でき、static キーワードはローカル変数を静的変数として宣言し、関数呼び出し間で値を保持できます。

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

Javaコールバック関数の書き方 Javaコールバック関数の書き方 Jan 09, 2024 pm 02:24 PM

Java コールバック関数の記述方法は次のとおりです: 1. インターフェイス コールバック、コールバック メソッドを含むインターフェイスを定義し、そのインターフェイスをコールバックをトリガーする必要があるパラメーターとして使用し、適切なタイミングでコールバック メソッドを呼び出します。匿名内部クラス コールバック 、追加の実装クラスの作成を避けるために、匿名内部クラスを使用してコールバック関数を実装できます; 3. ラムダ式コールバック. Java 8 以降では、ラムダ式を使用してコールバック関数の作成を簡素化できます。

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

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

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

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

Golang 関数のライフサイクルと変数スコープの深い理解 Golang 関数のライフサイクルと変数スコープの深い理解 Apr 19, 2024 am 11:42 AM

Go では、関数のライフ サイクルには定義、ロード、リンク、初期化、呼び出し、戻り値が含まれます。変数のスコープは関数レベルとブロック レベルに分割されますが、ブロック内の変数はブロック内でのみ表示されます。 。

See all articles