JavaScript 03関数は、ローカル変数のグローバル変数方法を定義します.

26928 ワード

関数
定義関数
public          (){
     
  return}
定義方式1
絶対値関数
function abs(x){
     
  if(x>=0){
     
    return x;
  }else{
     
    return -x;
  }
}
一旦、リセット代表関数が終了したら、結果を返します.
returnを実行していないと、関数が実行されても結果が返ってきます.結果はundefinedです.
定義方式2
var abs = function(x){
     
 if(x>=0){
     
   return x;
   }else{
     
   return -x;
 }
}
function(x){…}これは匿名関数です.しかし、結果をabsに割り当てることができます.absを通じて関数を呼び出すことができます.
関数を呼び出す
abs(10) // 10
abs(-10) // 10
javascriptは任意のパラメータを伝えることができます.パラメータを渡さなくてもいいです.
パラメータが入るかどうかの問題がありますか?パラメータが存在しないとどうやって回避しますか?
手動投げ異常
function abs(x){
     
  if(typeof x !== 'number'){
     
    throw 'not a number';
  }
  if(x>=0){
     
    return x;
  }else{
     
    return -x;
  }
}
アーグメンント
js無料サービスのキーワードです.
代表的に、渡されるすべてのパラメータは、行列です.
var abs2 = function(x){
     
  console.log("x=>"+x);
  for(var i = 0; i<arguments.length;i++){
     
    console.log(arguments[i])
  }
  if(arguments.length>1){
     
    arguments[1]
  }
}    
abs2(123,453,3124,45)
method.html:20 x=>123
method.html:22 123
method.html:22 453
method.html:22 3124
method.html:22 45
質問:argmentsはすべてのパラメータを含みます.
rest es 6に導入された新しい特性
既に定義されているパラメータ以外のすべてのパラメータを取得します.
// before
// if(arguments.length > 2){
     
//     for(var i = 2; i
//     }
// }
function aaa(a,b,...rest){
     
  console.log("a=>"+a);
  console.log("b=>"+b);       
  console.log(rest)
}
restパラメータは一番後ろにしか書けません.
aaa(1,3,4,6)
multiarg.html:9 a=>1
multiarg.html:10 b=>3
multiarg.html:19 (2) [4, 6]
変数のスコープ
var定義変数は実際にはスコープがあります.
ローカル変数
関数内で宣言したと仮定すると、関数の外部では使用できません.
function qj(){
     
  var x = 1;
  x = x + 1;
}
x = x + 2 // x is undefined
function qj1(){
     
  var x = 1;
  function qj2(){
     
    var y = x + 1; // 2              
  }
  var z = y + 1; //              
}
内部関数変数と外部関数の変数名
function qj3(){
     
  var x = 1;
  function qj4(){
     
    var x = 'a';
    console.log('inner'+x); // innera
  }
  console.log('outer'+x); // outer1
  qj4()
}
qj3()
javascriptにおいて、関数検索変数は自身の関数から始まり、「内」から「外」へ検索され、外部にこの同名の関数変数が存在すると内部関数は外部関数の変数をブロックします.
変数のスコープを上げる
function qj5(){
     
  var x = "x" + y;
  console.log(x)
  var y = 'y';
}
qj5()
// xundefined
JavaScript実行エンジンを説明して、自動的にyの声明を上げましたが、変数yの割当値は上がりません.
function qj6(){
     
  var y;
  var x = "x" + y;
  console.log(x);
  y = 'y';
}
仕様:すべての変数定義は関数の頭に置いてあります.むやみに置かないでください.コードの維持に便利です.
function qj7(){
     
  var x = 1,
      y = x+1,
      z,i; // undefined
  //       
}
グローバル変数
var x = 1;
function f(){
     
  console.log(x); // 1
}
f()
console.log(x); // 1
グローバルオブジェクトwindow
var x = 'xxx';
alert(x);
alert(window.x)
         ,       window   
alert()この関数自体もwindow変数です.
JavaScriptは実際には大域的な作用領域だけで、変数(関数は変数としても見なされます)があります.関数の作用範囲内に見つけられなかったら、外に探します.大域的な作用領域で見つけられなかったら、エラーを報告します.
規範
私たちのすべてのグローバル変数は私たちのwindowに結び付けられます.jsファイルが異なると、同じグローバル変数を使って衝突します.
どのように衝突を減らすことができますか?
//       
var zepei = {
     };
//       
zepei.name = "zepeizhao";
zepei.add = function(a,b){
     
  return a+b;
}
//                       ,          
ローカルスコープlet
//      
function aaa(){
     
  for(var i = 0;i<100;i++){
     
    console.log(i)
  }
  console.log(i+1) // 101
  //   : i             
}
aaa()
ES 6 letキーワード(推奨使用)、局所作用領域の衝突問題を解決します.
function aaa2(){
     
  for(let i = 0;i<100;i++){
     
    console.log(i)
  }
  console.log(i+1) // i is not defined
}
aaa2()
定数
ES 6の前に定数をどのように定義しますか?すべての大文字で命名された変数だけが定数です.このような変数の値は変更しないことをお勧めします.
// const
var PI = '3.14';
console.log(PI);
PI = '214';
console.log(PI);
ES 6常量キーワードconstを導入する
const PI = '3.14';
console.log(PI);
PI = '123'; // type error: assignment to constant variable
方法
方法は、関数をオブジェクトの中に置くことです.オブジェクトは二つのものしかありません.属性と方法です.
var zepei = {
     
  name:'zepeizhao',
  birth:1997,
  // function
  age:function(){
     
    // this year - birth year
    var now= new Date().getFullYear();
    return now - this.birth // this point to attribute
  }
}

// call attribute
zepei.name
// call function
zepei.age();
// output: 23
appy
jsではthisをコントロールできます.
function getAge(){
     
  var now = new Date().getFullYear();
  return now - this.birth;
}

var zepei = {
     
  name:'pp',
  birth:1997,
  age:getAge
};

var joe = {
     
  name:'joe',
  birth:1996,
  age:getAge
}

getAge.apply(zepei,[]); // this    zepei,