JavaScript Quiz-Legendを説明するこの記事に出会いました。とにかく、それは大丈夫なので、私は誰もが学び、理解し、唱え、批判するためにここにそれを持ってきたいです。
質問1
(function(){return typeof arguments; // "object"})();引数は、渡された関数のパラメーターリストに対応する配列のようなオブジェクトです。この変数を任意の関数で直接使用できます。
TypeOF演算子は、型文字列の結果のみを返します。次のリストを参照して、TYPEOFによって返される値が対応する異なるデータであることを知る:
これから、タイプの引数は目的であると推測します
質問2
var f = function g(){return 23; }; typeof g(); //エラーを報告しますこれはgという名前の関数式であり、変数fに割り当てられます。
ここでの関数名gとそれによって割り当てられた変数fには、次の違いがあります。
機能名gは変更できませんが、変数fを再割り当てすることができます
関数名Gは、関数本文内でのみ使用できます。関数の外部でGを使用しようとすると、エラーが報告されます。
質問3
(function(x){delete x; return x; // 1})(1);削除演算子はオブジェクトから属性を削除でき、正しい使用法は次のとおりです。
object.propertyを削除します
オブジェクトを削除['プロパティ']
削除演算子は、オブジェクトのプロパティでのみ使用でき、変数と関数名に対して無効です。つまり、xを削除することは意味がありません。
Deleteがメモリを直接リリースしないことを知っていることをお勧めします。間接的にオブジェクト参照を中断するだけです
質問4
var y = 1、x = y = typeof x; x; //「未定義」
上記のコードを次の2つの手順に分解しようとします。
var y = 1; //ステップ1
var x = y = typeof x; //ステップ2
最初のステップに異議はないはずです、2番目のステップを直接見てみましょう
1.割り当て式は右から左に実行されます
2。yがx typeof xに再割り当てされた結果、つまり未定義
3.xは、正しい式(y = typeof x)の結果として割り当てられます。つまり、未定義です
質問5
(function f(f){return typeof f(); // "number"})(function(){return 1;});直接コメント説明:
(function f(f){//ここにfはfunction(){return 1;} //実行の結果は自然に1つのreturn typef f(); //問題1のテーブルによると、1つの結果が「number」})(function(){return 1;});質問6
var foo = {bar:function(){return this.baz; }、baz:1};(function(){return typeof arguments [0](); // "未定義"})(foo.bar);ここでは、最終結果は数であると誤って考えることができます。パラメーターを関数に渡すことは割り当てと見なすことができるため、引数[0]はfoo.barへの参照ではなく、実際のバー関数の値を取得します。
質問7
var foo = {bar:function(){return this.baz; }、baz:1} typeof(f = foo.bar)(); // "未定義"これは前の質問と同じ問題です。 (f = foo.bar)参照ではなく、バーの値を返すため、これはfooを参照しません。
質問8
var f =(function f(){return '1';}、function g(){return 2;})(); typeof f; // "number"コンマオペレーターは、それぞれの動作オブジェクト(左から右)を評価し、最後の操作オブジェクトの値を返します。
したがって、(function f(){return '1';}、function g(){return 2;})のreturn値はfunction gで、それを実行すると、結果は2です。最後に、問題1の表によると、結果は自然に数字です
質問9
var x = 1; if(function f(){}){x += typeof f;} x; // "1undefined"この問題の重要なポイントは、関数式の関数式の関数fに関数本文の外側にアクセスすることはできません。
質問10
var x = [typeof x、typeof y] [1]; typeof typeof x; // "string"1。変数yが宣言されていないため、typeof yは「未定義」を返します。
2。タイプyの結果をxに割り当てます。つまり、xは「未定義」になりました。
3。その後、タイプxはもちろん「文字列」です
4.タイプの「文字列」の最終結果は、当然のことながら「文字列」です
質問11
(function(foo){return typeof foo.bar; // "未定義"})({foo:{bar:1}});これは純粋な視覚的なトリックです、とコメントしています
(function(foo){//ここのfooは{foo:{bar:1}}であり、bar属性はありません。質問12
(function f(){function f(){return 1;} return f(); // 2 function f(){return 2;}})();関数宣言を通じて宣言された関数は、この機能と呼ばれる宣言の前にも使用することもできます。したがって、上記のコードは実際にこのような実行中の環境によって説明されます:
(function f(){function f(){return 1;} function f(){return 2;} return f();})();質問13
function f(){return f; } new f()instanceof f; // falseコードの新しいf()が実行されると、以下が発生します。
1.新しいオブジェクトが作成されます。 f.prototypeから継承します
2。コンストラクターFが実行されます。実行中、対応するパスが渡され、コンテキスト(これ)がこの新しいインスタンスとして指定されます。新しいFは新しいF()に相当し、パラメーターが渡されない場合にのみ使用できます。
3.コンストラクターが「オブジェクト」を返した場合、このオブジェクトは全体の結果を置き換えます。コンストラクターがオブジェクトを返さない場合、新しい結果はステップ1で作成されたオブジェクトです。
PS:通常の状況では、コンストラクターは値を返しませんが、ユーザーがこの返品値を上書きしたい場合、通常のオブジェクトを返すためにそれを上書きすることを選択できます。もちろん、アレイもオブジェクトであるため、アレイを返すことも上書きされます。
したがって、新しいf()ここで私たちはまだそのインスタンスではなく関数f自体を返します
質問14
with(function(x、undefined){})長さ; // 2
withステートメントは、スコープチェーンの上部にオブジェクトを追加します。スコープチェーン内のプロパティと同じ名前を持つステートメントに名前空間を使用していない変数がある場合、変数はプロパティ値を指します。同じ名前のプロパティがある場合、参照エラー例外が発行されます。
function(x、undefined){}は匿名関数式であるため、関数であるため、それを見てみましょう。関数の長さの属性があり、関数のパラメーターの数を指します。したがって、最終結果は2です
最後に書かれています
これらの質問はトリッキーだと思う人もいれば、視野を広げ、自分の意見に依存すると考える人もいます。しかし、一つのことは真実です。あなたがしっかりした開業医であるかどうかにかかわらず、あなたは間違いなく理論的基盤なしでは遠くに行くことはありません - あなたは突然ロケットの専門家になる熟練した技術者が突然見えることはありません。
文書を読む、基準を読む、練習を組み合わせることは、同志にとって決定的な方法です。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。