ハンドラと範囲と異常

クリエイティブコモンズライセンス 著作権:帰属、紙ベースを作成するために他人を許可し、(同じライセンスで元のライセンス契約に基づいて用紙配布する必要がありますクリエイティブコモンズ

JS構文

機能

function 函数名(参数列表) {
    函数体;
    return 返回值; 
}

function add(x,y){
    return x+y; 
}
console.log(add(3,5));

関数式

関数名を定義する式を使用して、式は関数名が省略されていない場合は、省略することができ、この関数内でのみ使用することができます。

// 匿名函数
const add = function(x, y){
    return x + y;
};
console.log(add(4, 6));

// 有名字的函数表达式
const sub = function fn(x, y){
    return x - y;
};
console.log(sub(5, 3));
//console.log(fn(3, 2)); // fn只能用在函数内部

// 有名字的函数表达式
const sum = function _sum(n) {
    if (n===1) return n;
    return n + _sum(--n) // _sum只能内部使用
}
console.log(sum(4));

違い機能、匿名関数、関数式

  1. 関数と匿名関数は本質的に同じであり、オブジェクトの関数であるが、この関数は、独自の識別子がある - 関数名、匿名関数が唯一の他の識別子の助けを必要としています。
  2. 違いは、関数宣言のアップグレードで、式が機能しません。
console.log(add(4, 6));
// 匿名函数
function add (x, y){ // 声明提升
    return x + y;
};

//console.log(sub(5, 3)); //sub未定义
// 有名字的函数表达式
const sub = function (x, y){
    return x - y;
};
console.log(sub(5, 3));

高次機能

高階関数:関数の引数として、または関数を返します。

完全なカウンターカウンター

const counter = function (){
    let c = 0;
    return function(){
        return ++c;
    };
};

const c = counter()
console.log(c())
console.log(c())
console.log(c())

完全なマップ機能:いくつかの処理は、配列の要素のいずれであってもよいです

const map = function(arr,fn) {
    let newarr = [];
    for (let i in arr){
        newarr[i] = fn(arr[i]);
    }
    return newarr
}

console.log(map([1,2,3,4], function(x){return ++x}));

参照のみを目的として添付Builderのバージョンカウンタ

const counter = (function * () {
    let count = 1;
    while (true)
        yield count++;
})();

console.log(counter.next())
console.log(counter.next())

アロー機能

アロー機能は、それがより合理化フォーマットである、匿名関数です。
あなたは矢印の関数として機能し、上記の例を変更

// 以下三行等价
console.log(map([1,2,3,4], (x) => {return x*2}));
console.log(map([1,2,3,4], x => {return x*2}));
console.log(map([1,2,3,4], x => x*2));

アロー関数パラメータ

  1. この関数は()を使用して、パラメータがない場合
  2. 唯一つのパラメータ、パラメータリストは、(括弧を省略することができた場合)
  3. 複数のパラメータは、括弧を省略することができず、コンマを使用して分離します

アロー関数の戻り値

  1. 機能部の複数の列場合の戻り値のリターンがある場合、} {使用することが必要です。
  2. 一行のみステートメントの場合は、中括弧を省略することができ、同時に返します。
  3. 限りreturn文があるので、私たちは、中括弧を省略することはできません。console.log(マップ([1,2,3,4]、X => {戻り++ X}))、ブレースが返さなければなりません。
  4. 唯一つの非returnステートメント場合、一緒にブレースと、それは、リターン値なしで機能する、例えば、にconsole.log(マップ([1,2,3,4]、X => X { 2}));プラスブレースは、それは= X> Xリターン{と等価ではない 2}。したがって、ライン上のx => X * 2この正しいフォームを覚えています。

関数の引数

一般的なパラメータ

位置を占めパラメータは、デフォルトパラメータをサポート

const add = (x,y) => x+y;
console.log(add(4,5));

// 缺省值
const add1 = (x,y=5) => x+y;
console.log(add1(4,6));
console.log(add1(4));

だから、そこにある場合、そのような機能

const add2 = (x=6,y) => x+y;

これは許可されていますか?それを使用してみてください

console.log(add2());
console.log(add2(1));

console.log(add2(y=2,z=3)); // 可以吗?

ADD2は、呼び出す以上の結果だった
のNaN、NaNで、5
なぜ?

  1. JSとパラメータのPythonのキーワードを通過しませんでした
  2. JS位置パラメータだけでやるに対応
  3. JS位置は、デフォルトのパラメータに限定されるものではない
    ADD2()が追加に相当する(図6、不定)
    (1)の追加に対応ADD2(1、不定)
    ADD2(Y = 2、Z = 3)、ADD2(2,3)に対応Z = 3 3がされてそこにはキーワードJS質量参加はありませんが、それは代入式が値を持っているだから、yが2は2 =、
    推奨、デフォルトパラメータが戻って書いた、これは良い習慣です。

変数パラメータ(残りのパラメータは、パラメータの残り)

... JS(複数のパラメータを収集することによってパイソン*)が使用される可変パラメータであります

const sum = function (...args){
    let result = 0;
    for (let x in args){
        result += args[x];
    }
    return result;
};

console.log(sum(3,6,9))

引数オブジェクト

ファンクションキーのすべてのパラメータは、ディクショナリオブジェクトの引数のいずれかに格納されます

(function (p1, ...args) {
    console.log(p1);
    console.log(args);
    console.log('----------------');
    console.log(arguments); // 对象
    for (let x of arguments)
        console.log(x);
})('abc', 1,3,5)

ES6の前に、引数が唯一の変数パラメータである必要があり
ES6開始が推奨されていない、変数パラメータを使用することをお勧めします。互換性を保持するためには
、次のように、ノートを矢印の機能を使用し、引数に取るには、私たちが望むものではありません

((x,...args) => {
    console.log(args); // 数组
    console.log(x);
    console.log(arguments); // 不是传入的值
})(...[1,2,3,4]);

パラメータの解体

そして、Pythonのように、jsはまだ解体する記号を使用して、パラメータの解体を提供しています...

const add = (x, y) => {console.log(x,y);return x + y};
console.log(add(...[100,200]))
console.log(add(...[100,200,300,3,5,3]))
console.log(add(...[100]))

JS解体・サポート・パラメータ、パラメータの数及び解体を対応する必要はない値の数

関数の戻り値

1,2- Pythonは複数の値を返すために使用されてもよい、値が本質的にある戻り、タプルです。その中にJS?

const add = (x, y) => {return x,y};
console.log(add(4,100)); // 返回什么?

式の値:
クラスC言語は、概念がある-式の値が
代入式の値:等号の右辺の値
式のコンマ値:Cに似た言語、コンマ式、コンマ式をサポートしています値は、最後の式の値であり、

a = (x = 5, y = 6, true);
console.log(a); // true

b = (123, true, z = 'test')
console.log(b)

function c() {
    return x = 5, y = 6, true, 'ok'; 
}

console.log(c()); // ok

だから、機能のJSの戻り値は、まだ単一の値であります

スコープ

// 函数中变量的作用域
function test(){
    a = 100;
    var b = 200;
    let c = 300;
}
// 先要运行test函数
test()

console.log(a);
console.log(b); // 不可见
console.log(c); // 不可见

// 块作用域中变量
if (1){
    a = 100;
    var b = 200;
    let c = 300; 
}

console.log(a);
console.log(b);
console.log(c); // 不可见

関数は、関数定義され、定義された変数は、関数の外表示されていない、請求独立範囲であり、
100は文を、向上させることができる= VAR aは、の範囲破壊することができる非機能ブロック
に、暗黙の宣言文を登ることができない= 100 「strictモード」の下に間違っているが、暗黙のうちにグローバル変数として宣言された変数ことができます。あまり使用することを推奨
= 100文を上げることはできませんが、任意のブロックスコープを破ることはできませんしましょう。推奨

function show(i, arg) {
    console.log(i, arg) 
}

// 作用域测试
x = 500;
var j = 'jjjj';
var k = 'kkkk';

function fn(){
    let z = 400;
    {
        var o = 100; // var 作用域当前上下文
        show(1, x);
        t = 'free'; // 此语句执行后,t作用域就是全局的,不推荐
        let p = 200;
    }
    var y = 300;
    show(2,z);
    show(3,x);
    show(4,o);
    show(5,t);
    //show(6,p); // 异常,let出不来上一个语句块
    {
        show(7,y);
        show(8,o);
        show(9,t);
        {
            show(10,o);
            show(11,t);
            show(12,z);
        }
    }

    j = 'aaaa';
    var k = 'bbbb';
    show(20, j);
    show(21, k);
}

// 先执行函数
fn()

show(22, j);
show(23, k);

//show(13,y); // 异常,y只能存在于定义的上下文中,出不了函数
show(14,t); // 全局,但是严格模式会抛异常

//show(15,o) // 看不到o,异常原因同y

show(16,z); // 变量声明提升,var声明了z,但是此时还没有赋值
var z = 10;

const m = 1
//m = 2 // 常量不可以重新赋值

strictモード:「厳格な使用」;、最初の行の関数にこのステートメントは、スクリプトまたはjsファイルの最初の行

異常な

例外を投げます

Jsの異常同じ構文とJavaは、キーワードスロースローを使用する
任意のオブジェクトの例外をスローすることができますスローキーワードを使用して

throw new Error('new error');
throw new ReferenceError('Ref Error');
throw 1;
throw 'not ok';
throw [1,2,3];
throw {'a':1};
throw () => {}; // 函数

例外をキャッチ

例外がキャッチする... catch文を試してみてください
、例外をキャッチし、最後に、最終的な実行はしなければならないことを確実にするために... finally文をキャッチ...してみてください
、それはほとんどのcatchステートメントであるキャッチの種類をサポートしていないことに留意され。あなたは、catchステートメントブロック、裁量例外であってもよく、

try {
    //throw new Error('new error');
    //throw new ReferenceError('Ref Error');
    //throw 1;
    //throw new Number(100);
    // throw 'not ok';
    // throw [1,2,3];
    // throw {'a':1};
    throw () => {}; // 函数
} catch (error) {
    console.log(error);
    console.log(typeof(error));
    console.log(error.constructor.name);
} finally {
    console.log('===end===') 
}

記号の種類

ネイティブ型とES6オファーシンボルの種類、

let sym1 = Symbol()
let sym2 = Symbol('key1')
let sym3 = Symbol('key1')
console.log(sym2 == sym3) // false,symbol值是唯一的
  1. オブジェクトのキー属性として、
let s = Symbol()
let t = 'abc'
let a = {
    [s]:'xyz', // symbol做key,注意要使用中括号,这个key一定唯一t:'ttt', 
    [t]:'ooo'
}

console.log(a)
console.log(a[s])
a[s] = 2000
console.log(a[s])
  1. 定数の構築
// 以前用法
var COLOR_RED = 'RED';
var COLOR_ORANGE = 'ORANGE';
var COLOR_YELLOW = 'YELLOW';
var COLOR_GREEN = 'GREEN';
var COLOR_BLUE = 'BLUE';
var COLOR_VIOLET = 'VIOLET';

// 现在
const COLOR_RED = Symbol();
const COLOR_ORANGE = Symbol();
const COLOR_YELLOW = Symbol();
const COLOR_GREEN = Symbol();
const COLOR_BLUE = Symbol();
const COLOR_VIOLET = Symbol();

おすすめ

転載: blog.csdn.net/weixin_44800244/article/details/94892499