[解決済み】括弧を付けずに関数を呼び出す方法
質問
今日、括弧なしで関数を呼び出すことが可能だと聞きました。私が思いつくのは、次のような関数を使う方法だけでした。
apply
または
call
.
f.apply(this);
f.call(this);
しかし、これらには括弧が必要で
apply
と
call
のまま、振り出しに戻ります。また、この関数を次のようなイベントハンドラに渡すというアイデアも検討しました。
setTimeout
:
setTimeout(f, 500);
しかし、そこで問題になるのは、「どのようにして
setTimeout
括弧をつけないでください。
さて、このなぞなぞの解答は?Javascriptで括弧を使わずに関数を呼び出すにはどうしたらいいのでしょうか?
解決方法は?
括弧を付けずに関数を呼び出すには、いくつかの異なる方法があります。
このような関数が定義されているとします。
function greet() {
console.log('hello');
}
では、次に
greet
を括弧なしで表示します。
1. コンストラクタとして
と
new
を使用すると、括弧なしで関数を呼び出すことができます。
new greet; // parentheses are optional in this construct.
から
に関するMDN
new
オプリーター
:
シンタックス
new constructor[([arguments])]
2. として
toString
または
valueOf
実装
toString
そして
valueOf
は特別なメソッドです。変換が必要なときに暗黙のうちに呼び出されます。
var obj = {
toString: function() {
return 'hello';
}
}
'' + obj; // concatenation forces cast to string and call to toString.
このパターンを使って、(略)
greet
を括弧なしで表示します。
'' + { toString: greet };
または
valueOf
:
+{ valueOf: greet };
valueOf
と
toString
は、実際には
プリミティブ
メソッドを実装することもできます(ES6以降)。
あれ
メソッドを使用します。
+{ [Symbol.toPrimitive]: greet }
"" + { [Symbol.toPrimitive]: greet }
2.b オーバーライド
valueOf
関数プロトタイプの
先ほどのアイデアで
valueOf
メソッドを
Function
プロトタイプ
:
Function.prototype.valueOf = function() {
this.call(this);
// Optional improvement: avoid `NaN` issues when used in expressions.
return 0;
};
それができたら、書くことができます。
+greet;
また、この先には括弧が絡んできますが、実際のトリガーとなる起動には括弧がありません。これについては、ブログで詳しく紹介しています "JavaScriptでメソッドを呼び出す、実際に呼び出すことなく"。
3. ジェネレータとして
を定義することができます。
ジェネレータ機能
(を使用)。
*
を返します。
イテレータ
. を使用して呼び出すことができます。
展開構文
または
for...of
の構文があります。
まず、オリジナルの
greet
関数を使用します。
function* greet_gen() {
console.log('hello');
}
そして、それを括弧なしで呼び出すために イテレータ というメソッドがあります。
[...{ [Symbol.iterator]: greet_gen }];
通常、ジェネレータは
yield
というキーワードがありますが、これは関数が呼び出されるためには必要ありません。
最後の文は関数を呼び出していますが、これは 構造改革 :
[,] = { [Symbol.iterator]: greet_gen };
または
for ... of
という構文がありますが、それ自体に括弧があります。
for ({} of { [Symbol.iterator]: greet_gen });
なお、あなたは
できる
上記をオリジナルの
greet
関数も同様ですが、その過程で例外が発生します。
後
greet
が実行されました(FFとChromeでテスト)。例外を管理するには
try...catch
ブロックを作成します。
4. ゲッターとして
これについては@jehna1が完全な回答をしているので、彼を信用しましょう。以下は、関数を呼び出す方法です。
括弧なし
を回避し、グローバルスコープ上で
非推奨
__defineGetter__
メソッドを使用します。これは
Object.defineProperty
の代わりに
の変形を作成する必要があります。
greet
という関数があります。
Object.defineProperty(window, 'greet_get', { get: greet });
そして
greet_get;
交換
window
をグローバルオブジェクトに置き換えてください。
を呼び出すと、元の
greet
関数で、このようにグローバルオブジェクトにトレースを残さないようにすることができます。
Object.defineProperty({}, 'greet', { get: greet }).greet;
しかし、ここには括弧がある(実際の呼び出しには関与しないが)とも言える。
5. タグ機能として
ES6 以降、関数を呼び出すには、その関数に テンプレートリテラル という構文があります。
greet``;
参照 タグ付けされたテンプレート・リテラル。 .
6. プロキシハンドラとして
ES6以降では プロキシ :
var proxy = new Proxy({}, { get: greet } );
そして、任意のプロパティ値を読み取ることで
greet
:
proxy._; // even if property not defined, it still triggers greet
これには様々なバリエーションがある。もう一つ例を挙げます。
var proxy = new Proxy({}, { has: greet } );
1 in proxy; // triggers greet
7. インスタンスチェッカーとして
は
instanceof
演算子は
@@hasInstance
メソッドが定義されている場合、2 番目のオペランドに適用されます。
1 instanceof { [Symbol.hasInstance]: greet } // triggers greet
関連
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】エラー:リスン EACCES 0.0.0.0:80 OSx Node.js
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] ページを再読み込みせずにURLを変更するにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] jQueryを使用しない$(document).ready相当
-
[解決済み] 関数が実行されるまでの時間を測定する方法
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
-
[解決済み】JavaScriptのクロージャと無名関数の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React Js: Uncaught (in promise) SyntaxError: 位置 0 の JSON で予期しないトークン < が発生しました。
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み】PhantomJS 2.1.1を使用してReactJSアプリケーションをレンダリングできない理由とは?
-
[解決済み】ES6マップオブジェクトをソートすることは可能ですか?
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?
-
[解決済み] (a== 1 && a ==2 && a==3) が真に評価されることはあるのでしょうか?