1つは機能機能
- 関数もオブジェクトであり、一部の関数(コード)は関数にカプセル化でき、これらの関数(コード)は必要に応じて実行できます。
- 一部のコードは、必要なときに呼び出される関数に保存できます。
次に、コンストラクターを使用して関数オブジェクトを作成します
実際の開発では、コンストラクターを使用して関数オブジェクトを作成することはめったにありません。
var fun=new Function();
//构造函数来创建函数对象
- typeofを使用して関数オブジェクトをチェックすると、関数が返されます。
- カプセル化されるコードは、文字列の形式でコンストラクターに渡すことができます。
var fun=new Function("console.log('Hello 这是我的第一个函数');");
-
関数にカプセル化されたコードはすぐには実行されません
-
関数内のコードは、関数が呼び出されたときに実行されます
-
関数構文の呼び出し:関数オブジェクト()
-
関数が呼び出されると、関数にカプセル化されたコードが順番に実行されます
var fun=new Function("console.log('Hello 这是我的第一个函数');");
fun();//调用函数
结果:Hello 这是我的第一个函数
3つ目は、関数宣言を使用して関数を作成する
语法:
function 函数名([形参1,形参2...形参n]){
语句...(需要封装的代码)
}
语法:
function fun2(){
console.log('Hello 这是我的第二个函数');
}
//调用fun2
fun2();
4つ目は、関数式を使用して関数を作成する
var 函数名= function([形参1,形参2...形参n]){
语句...(需要封装的代码);
}
function(){
console.log("我是一个匿名函数中封装的代码");
}
最初に無名関数を作成し、次に変数fun3を定義してから、無名関数オブジェクトを変数に割り当てます。
//定义变量fun3保存函数对象
var fun3=function(){
console.log("我是一个匿名函数中封装的代码");
}
fun3();
5、関数のパラメータ
- 関数の()で1つ以上の仮パラメーターを指定できます。複数の仮パラメーターはコンマで区切ります。仮パラメーターを宣言することは、関数内で対応する変数を宣言することと同じですが、値を割り当てません。
function sum(a,b){
console.log(a+b);
}
- 関数を呼び出すときは、()で実際のパラメーターを指定できます。実際のパラメータは、対応する仮パラメータに割り当てられます。
sum(1,2);//调用函数sum,指定实参
- 関数を呼び出すとき、パーサーは実際のパラメーターのタイプをチェックしません。したがって、不正なパラメーターを受け取る可能性があるかどうかに注意して、パラメーターのタイプをチェックできます。
- 関数を呼び出すとき、パーサーは実際のパラメーターの数をチェックせず、冗長な実際のパラメーターは割り当てられません。
- 実際のパラメーターの数が仮パラメーターの数より少ない場合、対応する実際のパラメーターのない新しいパラメーターは未定義になります。
- 関数の実際のパラメーターは、任意のデータ型にすることができます。
6、関数の戻り値return
- returnを使用して、関数2の戻り値を設定できます
。構文:return value(variable); - 戻り後の値は関数の実行結果として返され、この結果を受け取る変数を定義できます。
- 関数内では、return後のステートメントは実行されません
function sum(a,b,c){
var d=a+b+c;
return d;不写
}
//调用函数
//变量result的值就是函数的执行结果
//函数返回什么result的值就是什么
var result=sum(1,2,3);
console.log(result);
- returnステートメントの後に値がない場合は、undefinedを返すことと同じです。書いていないことも未定義です。
5.返品後は、どのような種類の値でも返品できます。オブジェクトになることもできます
function people(){
return {
name:"lili"};
}
var a= people();//函数people作为实参传值
console.log(a);
機能にすることもできます
7つ目は、実際のパラメーターは任意の値にすることができます
- 実際のパラメーターは、任意のデータ型またはオブジェクトにすることができます。パラメーターが多すぎる場合は、パラメーターをオブジェクトにカプセル化してから、実際のパラメーターをオブジェクトに渡すことができます。
function people(o){
//o是形参,obj是一个实参对象,obj将赋值给o
console.log("我叫"+o.name+",我今年"+o.age+"岁了,我是"+o.gender+"生");
}
var obj = {
name:"lili",
age:22,
gender:"女"
};
people(obj);//将一个对象obj作为实参传入
- 実際のパラメーターは、オブジェクトの束または関数にすることができます
function people(o){
//o是形参,obj是一个实参对象,obj将赋值给o
console.log("我叫"+o.name+",我今年"+o.age+"岁了,我是"+o.gender+"生");
}
var obj = {
name:"lili",
age:22,
gender:"女"
};
people(obj);//将一个对象obj作为实参传入
function fun(result){
//console.log("这是一个函数作为实参的例子:"+result);
result(obj);
}
fun(people);//函数people作为实参传值
- 匿名関数を引数として別の関数に渡すことができます。
function test(){
}
test()是调用函数对象
fun(test(10))相当于fun这个函数对象调用了test函数以10为形参的返回结果
test是函数对象,相当于与直接使用这个函数对象
function fun1(){
return {
name:"lili"};
}
function fun2(a){
console.log( a.name); //lili
}
fun2(fun1());//调用fun1函数对象的返回值
八、休憩して続行して戻る
- Breakは現在のループを終了でき、現在のループ時間が実行された後は何も実行されません。
- 継続は、現在のループをスキップし、現在のループをスキップした後も実行を継続することと同じです。
- returnは関数全体を終了できます
9、すぐに関数を実行します
function(){
console.log("我是一个匿名函数中封装的代码");
}
//给匿名函数加一个括号表示一个整体
//在这个函数对象后面再加一个括号,表示调用这个函数对象,这是一个立即执行函数。
(function(){
console.log("我是一个匿名函数中封装的代码");
})();
即時実行関数:関数は定義され、すぐに呼び出されます。この種の関数は即時実行関数と呼ばれ、通常、即時実行関数は1回だけ実行されます。
10、コンストラクタークラス
- オブジェクト内のすべての異なるタイプに対して、Personオブジェクトの作成に特に使用されるコンストラクターを作成します。
- コンストラクターは通常の関数であり、作成方法は通常のメソッドと同じです。違いは、コンストラクターの最初の文字が通常大文字であるということです。
- 通常の関数は直接呼び出され、コンストラクターは新しいキーワードを使用して呼び出す必要があります
function Person(){
}
//new构造一个新对象
var per= new Person();
console.log(per);//{}
- コンストラクターの実行フロー:
(1)すぐに新しいオブジェクトを作成する
(2)関数でこのように新しく作成したオブジェクトを設定し、これを使用してコンストラクターで新しく作成したオブジェクトを参照します。Perは、新しく作成されたオブジェクトのアドレスを保持します。これは、新しく作成されたオブジェクト、つまりperオブジェクトを指します。
(3)関数内のコードを1行ずつ実行します。
(4)新しいキーのオブジェクトを戻り値として返します `
function Person(){
this.name="孙悟空";
this.age=18;
this.sayName=function(){
console.log(this.name);
};
}
//new构造一个新对象
var per= new Person();
console.log(per);
合格値:
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
console.log(this.name);
};
}
//new构造一个新对象
var per= new Person("孙悟空",18);
var per2= new Person("猪八戒",28);
console.log(per);
- 同じコンストラクターで作成されたオブジェクトはファーストクラスオブジェクトと呼ばれます。たとえば、per1とper2は同じタイプのオブジェクトであり、すべてがpersonクラスに属します。コンストラクターはクラスとも呼ばれます。
- コンストラクターを使用して、このクラスのインスタンスと呼ばれるオブジェクトを作成します。たとえば、perはPersonクラスのインスタンスです。
- instanceofを使用して、オブジェクトがインスタンスであるかどうかを確認します。構文:オブジェクトinstanceofコンストラクターがfalseではなくtrueを返す場合
console.log(per instanceof Person);
-
すべてのオブジェクトはObjectの子孫であるため、instanceofチェックを実行すると、すべてのオブジェクトとObjectがtrueを返します。
-
Personコンストラクターを作成します。Personコンストラクターでは、オブジェクトごとにsayNameメソッドが追加されます。
-
現在、メソッドはコンストラクター内に作成されます。つまり、コンストラクターが実行されるたびに新しいsayNameメソッドが作成され、すべてのインスタンスのsayNameは一意です。
-
これにより、コンストラクターを1回実行すると新しいメソッドが作成され、実行回数だけ新しいメソッドが作成されます。これらのメソッドはすべて同じであり、まったく不要です。
-
グローバルスコープでsayNameメソッドを定義します
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=fun;
}
//将sayName方法放在全局作用域中定义
function fun(){
console.log(this.name);
};
//new构造一个新对象
var per= new Person("孙悟空",18);
var per2= new Person("猪八戒",28);
console.log(per);
- ただし、グローバルスコープで関数を定義すると、グローバルスコープの名前空間が汚染され、グローバルスコープで関数を定義するのは安全ではありません。
- 研究ノートをとる9-プロトタイプ
function Person(name,age){
this.name=name;
this.age=age;
}
//new构造一个新对象
var per= new Person("孙悟空",18);
var per2= new Person("猪八戒",28);
Person.prototype.sayName=function(){
console.log(this.name);
}
console.log(per.sayName());