JS関数についての質問

6525 ワード

JS関数についての質問

  • 主に関数宣言式と関数式の違いを議論する:
  • まず2つの例を見ます:
  •  1a();// 
    function a(){
    	console.log(' ')
    }
    
     2a();//a is not a function
    var a = function (){
    	console.log(' ( )')
    }
    
  • 質問:なぜ実行結果が異なるのですか?なぜ例2の実行結果は「a is not defined」ではないのか.
  • 回答:JSの実行順序により、関数宣言と変数宣言がプリコンパイルされ、宣言式で定義された関数が関数昇格(類似変数昇格)する.一方、付与型関数(すなわち、関数式)の本質は、変数(aが実行される前に、aが変数の昇格によって変数宣言を完了する)を宣言し、匿名関数を付与することである.
  • さらに2つの例を見ます:
  •  1function a(){
    	console.log(' ')
    }
    var a = function (){
    	console.log(' ')
    }
    a();// 
    
     2var a = function (){
    	console.log(' ')
    }
    function a(){
    	console.log(' ')
    }
    a();// 
    
  • 問:例の宣言式関数と付与型関数は順序を変えたが、なぜ実行結果が同じなのか.
  • 答:宣言式関数はプリコンパイル段階で宣言されたため(そのため宣言式関数は任意に配置され、JS実行結果に影響を及ぼさずに優先的に宣言される)、変数aはJSがこの賦値文を実行する必要がある場合にのみ賦値関数を付与し、賦値型関数が宣言式a関数を置換したことに相当する.3、もう一つ変な例があります(よくわかりません)
  • function a(){
    	console.log(' a')
    }
    var b = function a(){
    	console.log(' b')
    }
    console.log(b)//function a(){console.log(' b')
    a();//' a'
    b();//' b'
    }
    
  • の2つの関数は異なる変数にあるが、変数bが関数宣言式と同じ形式で印刷されるのは理解できない.1つはプリコンパイルが宣言され、1つはJS実行時に宣言されたが、異なるストレージスペースを占めており、後者は前者を置き換えない.しばらくは理由がよく分からないので、後でよく知ってから修正します.