関数の定義と呼び出し
機能の定義。 JavaScriptでは、関数を定義する方法は次のとおりです。
関数abs(x){if(x> = 0){return x;} else {return -x;}}上記のABS()関数は次のように定義されています。
関数は、これが関数定義であることを示します。
ABSは関数の名前です。
(x)複数のパラメーターで区切られた括弧内の関数のパラメーターをリストします。
{...}間のコードは関数本文であり、いくつかのステートメントを含むことができます。
注:関数本文内のステートメントが実行されると、実行されるように実行されると、関数が実行され、結果が返されます。したがって、内部の決定とループは非常に複雑に実装できます。
返品ステートメントがない場合、結果は機能が実行された後に返されますが、結果は未定義です。
JavaScriptの関数もオブジェクトであるため、上記で定義されたABS()関数は実際に関数オブジェクトであり、関数名ABSは関数を指す変数と見なすことができます。
var abs = function(x){if(x> = 0){return x;} else {return -x;}}このように、関数(x){...}は、関数名のない匿名関数です。ただし、この匿名関数は可変ABSに割り当てられているため、機能は可変ABSを介して呼び出すことができます。
2つの定義は完全に同等です。 2番目の方法は、完全な構文に従って関数本体の最後にそれを追加する必要があり、割り当てステートメントが終了することを示していることに注意してください。
関数を呼び出すときは、次のパラメーターを渡すだけです。
ABS(10); // 10を返します
ABS(-9); // 9に戻ります
JavaScriptは影響を受けることなくパラメーターを渡すことを許可するため、これらのパラメーターは関数内では必要ありませんが、定義されたパラメーターよりも多くのパラメーターが渡されることは問題ありません。
ABS(10、 'Blablabla'); // 10を返します
abs(-9、 'haha'、 'hehe'、null)// 9に戻ります
定義されているよりも少ないパラメーターに問題はありません
abs();ナンを返します
この時点で、ABS(x)関数のパラメーターxは未定義であり、計算結果はnanです
関数abs(x){if(typeof x!== 'number'){shrow 'not a number':} if(x> = 0){return x;} else {return -x;}}議論
JavaScriptには無料のキーワード引数もあります。これは、関数内でのみ機能し、現在の関数の呼び出し元によって渡されたすべてのパラメーターを常に指しています。
function foo(x){alert(x); // 10for(var i = 0; i <arguments.length; ++){alert(arguments [i]); // 10,20,30}} foo(10.20,30)引数を使用すると、発信者がすべてのパラメーターを渡すことができます。つまり、関数がパラメーターを定義していなくても、パラメーターの値を取得できます。
function abs(){if(arguments.length === 0){return 0;} var x = arguments [0] return x> = 0? x:-x;} abs(); // 0ABS(10); // 10abs(-9)// 9実際、引数は、着信パラメーターの数を決定するために最も一般的に使用されます。あなたはこの文章を見るかもしれません:
// foo(a [、b]、c)
// 2〜3のパラメーターを受け入れ、Bはオプションのパラメーターです。入力されて終了したパラメーターが2つしかない場合、bはデフォルトでnullです
function foo(a、b、c){if(arguments.length === 2){//取得した実際のパラメーターはaおよびbcは未定義である= b; b = null; // bがデフォルト値になります中央のパラメーターBを「オプションの」パラメーターに変更するには、引数を通じてのみ判断し、パラメーターを再調整して値を割り当てることができます。
RESTパラメーター
JavaScript関数はパラメーターを受信できるため、問題に遭遇したときにすべてのパラメーターを取得するために引数を使用する必要があります。
function foo(a、b){var i、rest = []; if(arguments.length> 2){for(i = 2; i <arguments.length; i ++){rest.push(arguments [i]);}} console.log( 'a =' + a); console.log( 'b =' + b); console.log(ret);定義されたパラメーターAおよびB以外のパラメーターを取得するには、引数を使用する必要があり、ループはインデックス2から始まり、最初の2つのパラメーターを除外します。この書き込み方法は、余分なRESTパラメーターを取得するためだけに厄介です。より良い方法はありますか?
ES6標準はRESTパラメーターを導入し、上記の関数は次のように書き換えることができます。
function foo(a、b、... rest){console.log( 'a =' + a); console.log( 'b =' + b); console.log(rest);} foo(1,2,3,4,5);} foo(1,2,3,4,5); // a = 1 // b = 2 // array [3,4,5]RESTパラメーターは最後にのみ記述でき、実行結果からマークされています。操作の結果から、合格したパラメーターがA、Bに結合され、追加のパラメーターが配列内の可変安静に引き渡されることがわかります。
引数を必要とせずにすべてのパラメーターを取得します。
合格したパラメーターが通常の定義されたパラメーターで満たされていない場合、それは問題ではありません、残りのパラメーターは空の配列を受け取ります(未定義ではないことに注意してください)。
returnステートメント
JavaScriptエンジンには、ラインの終わりにセミコロンを自動的に追加するメカニズムがあるため、リターンステートメントで大きなピットに落ちる可能性があると述べました。
function foo(){return {name: 'foo'};} foo(); // {name: 'foo'}注記:
function foo(){return:// semicolonが自動的に追加されました。 //この一連のステートメントは実行できなくなりました。 }したがって、複数の行を書く正しい方法はそうです
function foo(){return {// semicolonは、ステートメントがまだ終わっていないことを意味するため、ここでは自動的に追加されません。名前: 'foo'}}可変スコープ
JavaScriptでは、VARで宣言されているものは実際にはスコープされています。
変数が関数本文内で宣言されている場合、変数の範囲は関数本体全体であり、変数は関数本文の外側で参照されるべきではありません。
'Strictを使用する':function foo(){var x = 1; x = x +1;} x = x +2; // refenceErrorは関数の外側の変数xを参照できません2つの異なる関数がそれぞれ同じ変数を宣言する場合、変数はそれぞれの関数の本体内でのみ機能します。言い換えれば、異なる関数内の同じ名前を持つ変数は互いに独立しており、互いに影響を与えません。
「structを使用」:function foo(){var x = 1; x = x +1;} function bar(){var x = 'a'; x = x + 'b';}JavaScript関数はネストできるため、内部関数は外部関数によって定義された変数にアクセスできます。
'strict'; function foo(){var x = 1; function bar(){var x = 1; function bar(){var y = x +1; // barは、foo z = y + 1の変数xにアクセスできます。 //参照エラー! fooはバーの変数yにアクセスできません! }}内部関数と外部関数の変数名が2倍になった場合はどうなりますか?
'Strict'を使用:function foo(){var x = 1; function bar(){var x = 'a'; alert( 'x in bar()=' + x); // 'a'} alert( 'x in foo()=' + x)// 1bar();}可変強化
JavaScriptの関数定義には機能があり、最初に関数本体ステートメント全体をスキャンし、すべての宣言された変数を関数の上部に「アップグレード」します。
'strict'; function foo(){var x = 'hello、'+y; alert(x); var y = 'bob';} foo();上記のfoo()関数の場合、JavaScriptエンジンで見られるコードは以下と同等です。
function foo(){var y; //変数y = 'hello' + y; alert(x); y = 'bob';}のvar xを上げるJavaScriptのこの奇妙な「特徴」のため、関数内の変数を定義するとき、「関数内で最初にすべての変数を宣言する」というルールを厳密に順守してください。最も一般的な方法は、VARを使用して、関数で内部で使用されるすべての変数を宣言することです。
function foo(){var x = 1、// xは1y = x +1に初期化され、// yは2z、i; // zと私は未定義です//他のステートメント(i = 0; i <100; i ++){...}}グローバル範囲
任意の関数で定義されていない変数には、グローバルな範囲があります。実際、JavaScriptには、デフォルトではグローバルなスコープ変数があり、実際にはウィンドウのプロパティにバインドされています。
「Strictを使用」; var source = 'learn javascript'; alert(course); // 'JavaScriptを学ぶ'; alert(window.course); //「JavaScriptを学ぶ」
名前空間
グローバル変数はウィンドウにバインドされます。異なるJavaScriptファイルは同じグローバル変数を使用するか、同じ名前のトップレベル関数を持っています。
矛盾を命名し、検出が困難です。
競合を減らす1つの方法は、すべての変数と機能をグローバル変数に結合することです。
//唯一のquju変数myappvar myapp = {}; //その他の変数:myapp.name = 'myapp'; myapp.version = 1.0; //その他の関数myapp.foo = function(){return 'foo';};すべてのコードを一意の名前空間に入れると、myAppはグローバルな変動競合の可能性を大幅に減らします。
ローカルスコープ
JavaScriptの変数スコープは実際には関数内にあるため、ループなどのステートメントブロックで定義できない変数を定義することはできません。
function foo(){for(var i = 0; i <100; i ++){//} i+= 100; //変数は引き続き参照できます;}ブロックレベルの範囲を解決するために、ES6は新しいキーワードLETを導入しました。VARの代わりに、ブロックレベルのスコープ変数を宣言できます。
function foo(){var sum = 0; for(let i = 0; i <100; i ++){sum += i;} i += 1;}絶え間ない
VARと変数を宣言させてください。定数を宣言したい場合は、ES6の前に機能しません。私たちは通常、すべての資本変数を使用して、これが定数であることを示します
その価値を変更しないでください。
var pi = 3.14;
ES6標準では、ConstとLetの両方の定数を定義する新しいキーワードconstを導入します。
const pi = 3.14;
pi = 3; //一部のブラウザはエラーを報告しませんが、効果はありません。
pi; // 3.14
上記のJavaScript Basic Functions_in-depth変数とスコープのデプス分析は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。