JavaScript入門の基本関数詳細

7918 ワード

総じて言えば、関数はJavaScriptにあります.
◆変数に割り当てられた値
◆オブジェクトに割り当てられた属性
◆パラメータとして別の関数に導入されました.
◆関数としての結果が返ってきます.
◆字面量で作成
関数オブジェクト
1.1作成関数
JavaScript関数を作成するための長い間使われない方法(ほとんど使われていない)は、newオペレータを通じてFunctionの「コンストラクタ」に作用するものです.

   var funcName = new Function( [argname1, [... argnameN,]] body ); 
 
パラメータリストには任意のパラメータがあります.

   var add = new Function("x", "y", "return(x+y)"); 
  
print(add(2, 4));
結果を印刷します.
6
しかし、誰がこんなに難しい方法で関数を作成しますか?関数が複雑であれば、このStringをつなぎ合わせるには大きな力がかかります.だから、JavaScriptは文法飴を提供しています.つまり、文字どおりの量で関数を作成します.

   function add(x, y){ 
  
return x + y;
}
または:

   var add = function(x, y){ 
  
return x + y;
}
実際には、このようなシンタックスキャンディーは従来の分野のプログラマに誤解を与えやすく、Functionキーワードは一つのオブジェクトにFunctionを呼び出して、パラメータテーブルと関数体を正確にFunctionのコンフィギュレーションに伝達します.
一般的に、グローバルスコープ内で一つのオブジェクトを宣言するのは、一つの属性に対してだけです.例えば、上記の例のadd関数は、実際にはグローバルオブジェクトに属性を追加しただけです.属性名はaddで、属性の値は一つのオブジェクト、すなわちfunction(x,y){return x+y}です.これを理解することが重要です.この文は文法的には以下の通りです.

   var str = "This is a string"; 
 
同じである.すべては、グローバルオブジェクトのダイナミックな属性を追加するだけです.
関数を説明するために、他のオブジェクトと同じように、独立したオブジェクトとしてJavaScriptに存在するオペレーティングシステムです.このような例を見てもいいです.

   function p(){ 
  
print("invoke p by ()");
}

p.id = "func";
p.type = "function";

print(p);
print(p.id+":"+p.type);
print(p());
間違っていません.pは匿名関数(オブジェクト)を引用していますが、属性を持つことができます.完全に他のオブジェクトと同じです.
function(){
print(「invoke p by()」);
)
func:function
invoke p by()
1.2関数のパラメータ
JavaScriptでは、関数のパラメータが面白いです.例えば、どのような多くのパラメータを関数に渡すことができます.この関数が宣言されていても、形式パラメータが設定されていません.

   function adPrint(str, len, option){ 
  
var s = str || "default";
var l = len || s.length;
var o = option || "i";

s = s.substring(0, l);
switch(o){
case "u":
s = s.toUpperCase();
break;
case "l":
s = s.toLowerCase();
break;
default:
break;
}

print(s);
}

adPrint("Hello, world");
adPrint("Hello, world", 5);
adPrint("Hello, world", 5, "l");//lower case
adPrint("Hello, world", 5, "u");//upper case
関数adPrintは、宣言時に3つの形式のパラメータを受け取ります.印刷する列の長さを、大文字と小文字のラベルに変換しますか?しかし、呼び出し時には、順番にadPrintのパラメータ、二つのパラメータ、または三つのパラメータに渡すことができます.(3つ以上に渡すこともできます.大丈夫です.)
ハロー、ワールド
ハロー
ハロー
HELLO
実際、JavaScriptは関数のパラメータを処理する時、他のコンパイル型の言語とは違って、インタプリタが関数に伝達するのは配列の内部値と似ています.これは関数オブジェクトの生成時に初期化されました.例えば、私たちがadPrintに渡すパラメータの場合、他の2つのパラメータはそれぞれundefinedです.そうすると、adPrint関数の内部でundefinedパラメータを処理して、外部に公開できます.任意のパラメータを処理できます.
他の例を通してこの不思議なargmentsを議論します.

   function sum(){ 
  
var result = 0;
for(var i = 0, len = arguments.length; i < len; i++){
var current = arguments[i];
if(isNaN(current)){
throw new Error("not a number exception");
}else{
result += current;
}
}

return result;
}

print(sum(10, 20, 30, 40, 50));
print(sum(4, 8, 15, 16, 23, 42));//《 》
print(sum("new"));
関数sumには明示的な形の参がなく、またそれらの任意の多くのパラメータに動的に伝達することができますが、sum関数ではどのようにこれらのパラメータを参照しますか?ここではargmentsという疑似配列が必要です.運転結果は以下の通りです.
150
108
Error:not a number exception
関数のスコープ
作用領域の概念はほとんどの主流言語において体現されています.JavaScriptには、その特殊性があります.JavaScriptにおける変数の作用領域は関数の体内で有効で、ブロックの作用領域はなく、Java言語において、for循環ブロックにおける下基準変数をこのように定義できます.
public void method()
for(int i=0;i<obj 1.length;i+){
//do something here;
)
//このときのiは未定義です.
for(int i=0;i<obj 2.length;i+){
//do something else;
)
)
JavaScriptでは、

   function func(){ 
  
for(var i = 0; i < array.length; i++){
//do something here.
}
// i , I == array.length
print(i);//i == array.length;
}
JavaScriptの関数は局所的な作用領域で動作し、局所的な作用領域で動作する関数は、その外層の変数と関数にアクセスすることができる.JavaScriptの作用域は語法作用域であり、所謂語法作用域とは、その作用域は定義時(語法分析時)に確定されたもので、実行時に決定されるものではなく、以下の例である.

   var str = "global"; 
  
function scopeTest(){
print(str);
var str = "local";
print(str);
}

scopeTest();
運行結果は何ですか?初心者はこのような答えを出す可能性があります.
global
local
正しい結果は、
undefined
local
関数scopeTestの定義では、予め未宣言の変数strにアクセスしてからstr変数を初期化するので、最初のprintはundifinedエラーに戻ります.なぜ関数はこの時外部のstr変数にアクセスしないのですか?これは、語法解析が終了した後に、作用域チェーンを構築する際に、関数内で定義されているvar変数をこのチェーンに入れるため、strは関数scopeTest全体で見られます.ですから、3行目のprintは「local」に戻ります.
関数のコンテキスト
JavaまたはC/C++などの言語では、方法(関数)はオブジェクトに依存してのみ存在することができます.独立したものではありません.JavaScriptでは、関数もオブジェクトであり、他のオブジェクトの一部ではなく、この点を理解することが特に重要であり、特に関数式を理解するJavaScriptには非常に有用であり、関数式プログラミング言語では、関数は一等と見なされています.
関数の文脈は変化することができますので、関数内のthisも変化することができます.関数はオブジェクトとしての方法もありますし、別のオブジェクトとしての方法もあります.つまり、関数自体は独立しています.関数のコンテキストは、Functionオブジェクトのcallまたはappy関数で変更できます.
callとappy
callとapplyは通常関数のコンテキストを修正するために用いられます.関数のthisポインタはcallまたはappyの最初のパラメータに置き換えられます.JavaScript入門の対象とJSONの例を見てみましょう.
//一人を定義します.名前はジャックです.
var jack={
name:「jack」、
メッセージ:26
)
//他の人を定義しています.名前はabruziです.
var abruzi={
name:「abruzi」、
メッセージ:26
)
//グローバルの関数オブジェクトを定義する
function printName(){
return this.name;
)
//printNameを設定するコンテキストはjackで、この時のthisはjackです.
print(print Name.call);
//print Nameを設定するコンテキストはabruziで、この時のthisはabruziです.
print(print Name.call);
print(print Name.apply);
print(print Name.apply);
一つのパラメータだけの場合、callとappyの使い方は同じです.複数のパラメータがある場合:
set Name.apply(jack Sept.);
print(print Name.apply);
set Name.call(abruzi);
print(print Name.call);
得られた結果は:
ジャックセット.
John Abruzi
applyの2番目のパラメータは関数として必要なパラメータからなる配列ですが、コールはいくつかのパラメータと、パラメータの間にコンマ(、)で区切られてもいいです.
使用関数は先に述べましたが、JavaScriptでは、関数は
◆変数に割り当てられた値
◆オブジェクトに割り当てられた属性
◆パラメータとして別の関数に導入されました.
◆関数としての結果が返ってきます.
私たちはそれぞれこれらの場面を見に来ました.
変数に値を割り当てます.
//関数を宣言し、2つのパラメータを受け取り、その和を返します.
function add(x,y){
return x+y
)
var a=0
a=add;//関数に変数を割り当てます.
var b=a(2,3)//この新しい関数を呼び出すa
print(b)
このコードは「5」を印刷します.変数aは関数addを参照します.つまり、aの値は関数オブジェクト(実行可能コードブロック)です.したがって、a(2,3)のような文言を使用して求めればいいです.
オブジェクトに割り当てられた属性:

   var obj = { 
  
id : "obj1"
}

obj.func = add;// obj
obj.func(2, 3);// 5
実際には、この例は前の例と本質的に同じであり、最初の例のa変数は、実際にはグローバルオブジェクト(クライアント環境においてwindowオブジェクトとして表示される場合)の一つの属性である.第二の例は、Objオブジェクトです.私たちは大域オブジェクトを直接参照することが少ないので、別々に説明します.
パラメータとして渡す:
//上位印刷関数の2番目のバージョン
function adPrint 2(str,handler){
print(handler);
)
//文字列を大文字に変換して返します.
function up(str){
return str.toUpperCase()
)
//文字列を小文字に変換して返します.
function low(str){
return str.torowerCase()
)
adPrint 2(「ハロー、world」、up)
adPrint 2(「ハロー、world」、low)
このセッションを実行すると、このような結果が得られます.
HELLO,WORLD
ハロー、ワールド
関数adPrint 2の2番目のパラメータは、実際には関数であり、この処理関数をパラメータとして導入し、adPrint 2の内部では、依然としてこの関数を呼び出すことができます.この特徴は多くのところで有用です.特に、いくつかのオブジェクトを処理したいと思いますが、どのような形で処理するかは不明です.抽象的な粒度として包装します.
関数としての戻り値:
まず一番簡単な例を見てください.

   function currying(){ 
  
return function(){
print("curring");
}
}
関数curryingは匿名関数を返します.この匿名関数は「curring」を印刷します.簡単な呼び出しで、以下の結果が得られます.

   function (){ 
  
print("curring");
}
curryingが戻ってくるこの匿名関数を呼び出すには、このようなことが必要です.
currying()(
最初の括弧操作は、currying自体を呼び出したことを示し、このときの戻り値は関数であり、第二の括弧操作子がこの戻り値を呼び出すと、このような結果が得られる.
currying