Javascript関数のまとめ
9858 ワード
関数の定義
関数名には、アルファベット、数字、アンダースコアまたは$のみが含まれます.数字で始まることはできません.関数で表式または関数宣言文を定義できます.
var f=function fact(x){}
関数定義式には名前が含まれています.名前は関数の局所変数として関数の内部で使用されます.
関数宣言文は本当の語句ではなく、循環、条件、try/catch/finally及びwith文には現れません.ステートメント文は、実行されない位置に置いても、スコープ全体にアクセスできます.コードが定義される前に使用できます.表式を定義する変数宣言は前倒しされましたが、変数の割り当ては前倒しされません.関数は定義される前に使用できません.さもなければ、呼び出し時にエラーが発生します.「Type Error:undefined is not a function」
return文には関連する表現がない場合、undefined値を返します.一つの関数がreturn文を含まない場合、関数の体内文のみを実行し、undefinedに戻ります.リターン値の関数がなく、プロセスと呼ばれることがあります.
関数の実行
関数が実行するいくつかの方法は、関数、方法、コンストラクタ、間接的な呼び出しとして使用されます.コンストラクタがイメージされていない場合は、実際の参照リストと括弧を省略して、関数の参照を呼び出して、間隔がある場合は、空白のパラメータをnullまたはundefinedプレースホルダで置換できます.
実際の参加対象はクラスの配列オブジェクトで、argments.calleeで再帰的に呼び出されます.パラメータをargmentsと名づけると、このパラメータは元の特殊変数をカバーします.
関数の参照と参照
指定された関数括弧内の後方の参照によって、該当する参加者にはデフォルト値がundefinedであり、これを利用して関数内部の局所変数を暗黙的に定義します.関数の入力パラメータのチェックサムがエラーを投げました.関数から実際に入力されたのは参照です.関数内部の操作は外部にも見られます.
関数もオブジェクトですので、属性と方法、関数のlength属性、関数の変形の個数もあります.
apply方法の2番目のパラメータは、配列またはクラスの配列オブジェクトとすることができる.
bind方法はES 5において新たに追加され、関数をオブジェクトに「結合」し、一部のパラメータを導入し、入力された実参照は完全な実参照リストの左側に配置される.
関数がパラメータや戻り値として使用される場合は高次関数と呼ばれます.
名前空間の関数として
関数名前空間暴露インターフェースには以下のいくつかの方法があります.
関数の表記基準
関数パラメータ定義のいくつかのコメント
関数名には、アルファベット、数字、アンダースコアまたは$のみが含まれます.数字で始まることはできません.関数で表式または関数宣言文を定義できます.
var f=function fact(x){}
関数定義式には名前が含まれています.名前は関数の局所変数として関数の内部で使用されます.
関数宣言文は本当の語句ではなく、循環、条件、try/catch/finally及びwith文には現れません.ステートメント文は、実行されない位置に置いても、スコープ全体にアクセスできます.コードが定義される前に使用できます.表式を定義する変数宣言は前倒しされましたが、変数の割り当ては前倒しされません.関数は定義される前に使用できません.さもなければ、呼び出し時にエラーが発生します.「Type Error:undefined is not a function」
return文には関連する表現がない場合、undefined値を返します.一つの関数がreturn文を含まない場合、関数の体内文のみを実行し、undefinedに戻ります.リターン値の関数がなく、プロセスと呼ばれることがあります.
関数の実行
関数が実行するいくつかの方法は、関数、方法、コンストラクタ、間接的な呼び出しとして使用されます.コンストラクタがイメージされていない場合は、実際の参照リストと括弧を省略して、関数の参照を呼び出して、間隔がある場合は、空白のパラメータをnullまたはundefinedプレースホルダで置換できます.
function MyClass(name) {
this.name = name;
return name; // ?
}
var obj1 = new MyClass('foo');// MyClass
var obj2 = MyClass('foo');// ‘foo’
var obj3 = new MyClass({});// {}
var obj4 = MyClass({});// {}
オブジェクトを参照実際の参加対象はクラスの配列オブジェクトで、argments.calleeで再帰的に呼び出されます.パラメータをargmentsと名づけると、このパラメータは元の特殊変数をカバーします.
関数の参照と参照
指定された関数括弧内の後方の参照によって、該当する参加者にはデフォルト値がundefinedであり、これを利用して関数内部の局所変数を暗黙的に定義します.関数の入力パラメータのチェックサムがエラーを投げました.関数から実際に入力されたのは参照です.関数内部の操作は外部にも見られます.
//
var oo = {
x: 1, y: 2, get z() {
return 3;
}
}
function fns(obj) {
obj.h = 4;
}
fns(oo);
関数の属性、方法関数もオブジェクトですので、属性と方法、関数のlength属性、関数の変形の個数もあります.
apply方法の2番目のパラメータは、配列またはクラスの配列オブジェクトとすることができる.
bind方法はES 5において新たに追加され、関数をオブジェクトに「結合」し、一部のパラメータを導入し、入力された実参照は完全な実参照リストの左側に配置される.
/**
* ES5.0 bind ,ES3.0 bind, ES3 , ,
* ,
* https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
*/
Function.prototype.bind || (Function.prototype.bind = function (that) {
var target = this;
// If IsCallable(func) is false, throw a TypeError exception.
// call、apply ,
if (typeof target !== 'function') {
throw new TypeError('Bind must be called on a function');
}
var boundArgs = slice.call(arguments, 1);
function bound() {
// bind
if (this instanceof bound) {
var self = createObject(target.prototype);
var result = target.apply(
self,
boundArgs.concat(slice.call(arguments)));
// Object(result) === result
return Object(result) === result ? result : self;
}
// bind
else {
return target.apply(
that,
boundArgs.concat(slice.call(arguments)));
}
}
// NOTICE: The function.length is not writable.
bound.length = Math.max(target.length - boundArgs.length, 0);
return bound;
});
高次関数関数がパラメータや戻り値として使用される場合は高次関数と呼ばれます.
名前空間の関数として
関数名前空間暴露インターフェースには以下のいくつかの方法があります.
var mylib = (function (global) {
function log(msg) {
console.log(msg);
}
log1 = log; // : var , log1 ( )
global.log2 = log; // : log2 , log ( )
return { // : , mylib( )
log: log
};
}(window));
自己更新関数function selfUpdate() {
window.selfUpdate = function () {
alert('second run!');
};
alert('first run!');
}
selfUpdate(); // first run!
selfUpdate(); // second run!
この関数は1回だけ実行する論理に使用でき、1回目の運転の後に全体を新しい論理に置き換えることができます.関数の表記基準
関数パラメータ定義のいくつかのコメント
/*,...*/
AP.reduce || (AP.reduce = function(fn /*, initial*/) {
getPropertyNames(o,/*optional*/a) // /*optional*/
function arraycopy(/*array */ from,/*index*/from_start){};
}
記憶機能の関数/**
*
*/
function memorize(f) {
var cache = {};
return function () {
var key = arguments.length + '' + Array.prototype.join.call(arguments, ',');
if (!(key in cache))
cache[key] = f.apply(null, arguments);
return cache[key];
}
}