関数アップと昇格面接に関する問題


作者の昇格に関する話題は全部で二編あります.(その後、もう一つの討論編があります.)また運んできました.レベルが限られています.もし翻訳の不正確さがあったら、ご勘弁ください.そして原文を見に行きます.次から開始します
これは私の前の「昇格」に関する文章で、タイトルは「let、constであなたのJavaScript変数アップを指導します」(中/英)の第二部分です.したがって、深く研究する前に、最初の部分を読んだことがあることを確認してください.
以前は変数のアップグレードだけを議論しましたが、関数のアップグレードはJavaScriptで変数のアップグレードとは違っています.それは独自の方法を持っています.ここで関数を広げて、面接官総会で質問する「アップグレード」(変数と関数)の苦手な問題を解決します.
この二つの部分を完成することによって、本当にJavaScript検査リストから消してほしいです.
始めましょう.
関数アップ
JavaScriptには関数宣言と関数式を通じて関数を作成する2つの方法があります.この二つの方法はどうやって「昇格」に影響を与えますか?
関数宣言
関数を指定したパラメータで定義します.構文:
function name(param1, param2, ...) {
  [statements]
}
JavaScriptでは、関数宣言の昇格関数の定義があります.したがって、これらの関数は宣言される前に使用できます.例:
hoisted() // output: "Hoisted"

function hoisted() {
  console.log('Hoisted')
}
以下の例では、JavaScriptコンパイラが上のコードをどう見るかを示しています.
// Hoisted code
function hoisted() {
  console.log('Hoisted')
}// Rest of the code
hoisted() // output: "Hoisted" 
グローバルスコープまたは機能エリアのスコープ(JavaScriptでは基本的にローカルスコープと呼ばれています)で関数声明をすると、この行為は真実です.これは非常に有用です.コードの先頭に高級な論理を使用して、読み取りと理解を可能にします.ヒント:「if/else」で関数宣言をしないでください.
関数式
「function」のキーワードは一つの表現で関数を定義することもできます.構文:
const myFunction = function [name](param1, param2, ...) {
  [statements]
}
関数名はオプションですので、匿名関数としても良いです.矢印関数を使ってもいいです.
const myFunction = (param1, param2, ...) => {
  [statements]
}
JavaScriptでは関数表現が向上しませんでした.したがって、それらを定義する前に関数式を使用することはできません.例:
notHoisted() // TypeError: notHoisted is not a function

const notHoisted = function() {
  console.log('foo')
}
関数の作成中の「昇格」部分については、以上のすべてを覚えておきます.今から面接の問題を見に来ます.
「昇格」面接問題
「レベルアップ」の不安定な行動は常に面接中のホットな問題です.前と今のこの2つの文章の知識を使って、この話題の中のいかなる問題を解答することができます.
問題1:
var a = 1;

function b() {
  a = 10;
  return;

  function a() {}
}

b();
console.log(a);
出力:1、なぜですか?これは、「function a(){}」宣言が「関数/局所」の作用領域に作成されているからです.この新しい「a」関数は、宣言と定義の際にその閉鎖関数bの頂点に引き上げられます.次のデモでは何が起きましたか?
var a = 1;

function b() {
  // Hoisted
  function a() {}

  a = 10;
  return;
}

b();

console.log(a)
したがって、a=10を賦課する.グローバル作用領域aの値を変えることはできず、任意に1であるが、ローカルaを関数から整数10に変更する.宣言関数aがここにいない場合、10が出力されます.
問題2:
function foo(){
    function bar() {
        return 3;
    }
    return bar();
    function bar() {
        return 8;
    }
}
alert(foo());
出力:8つのbarはいずれも関数で宣言された関数であり、fooの局所作用領域の頂点に引き上げられます.
しかし、8に戻るbar()は、最初のリターン3のアップグレードよりも遅くなります.したがって、この戻り8の関数が実行されます.
後のシーン:
function foo(){
    //Hoisted before
    function bar() {
        return 3;
    }
    // Hoisted after
    function bar() {
        return 8;
    }    return bar();
    
}
alert(foo());
問題3:
function parent() {
    var hoisted = "I'm a variable";
    function hoisted() {
        return "I'm a function";
    }
    return hoisted(); 
}
console.log(parent());
出力:「タイプエラー:hoistedは関数ではありません」これはとても怪しいです.関数vs変数!私たちは分析してみます.私達はすべて知っていて、変数の昇格といえば、ただ声明が昇格されます(値は「undefined」です)、定義ではありません!
関数宣言の場合は、ステートメントと定義が一緒に向上します.現在、同じ識別子宣言が複数ある場合(変数と関数は同じスコープ内にある)、この変数のリフティングは直接無視されます.
インタプリタは関数のみを宣言して、それを向上させます.
最終的には、この宣言は変数変数の割当値が実行され(昇格されていない)、昇格された関数に値が割り当てられています.
これは関数ではなく単純な文字列です.そこで間違えました
この後ろのシーンは問題を再現しました.
function parent() {    // Function declaration hoisted with the definition
    function hoisted() {
        return "I'm a function";
    }    // Declaration ignored, assignment of a string
    hoisted = "I'm a variable";
    return hoisted(); 
}
console.log(parent()); 
問題4:
alert(foo());
function foo() {
  var bar = function() {
    return 3;
  };
  return bar();
  var bar = function() {
    return 8;
  };
}
出力:3これは簡単です.関数foo()自体が関数として大域的に向上すると宣言します.関数fooでは,2つの明確な関数式の例である.
コンパイラは、2番目の関数bar(アップグレードされていません)を事前に読み込まないです.最初は実行されて戻ります.
問題5:
var myVar = 'foo';(function() {
  console.log('Original value was: ' + myVar);
  var myVar = 'bar';
  console.log('New value is: ' + myVar);
})();
出力:「Original value was:undefined」、「New value is:bar」
この例では、グローバル変数myVarの値「foo」がpictureの外に現れる.これは変数myVarが関数のスコープ内で声明と定義を行い、IIFの頂点に引き上げられたためで、値は「undefined」であり、彼が最初に記録されたからです.そして値「bar」を割り当てて記録します.
これは私のところのJavaScriptアップのまとめです.
この二つの(中/英)の文章があなたに役立つことを願います.
矢印関数とES 6の他の機能を勉強したいなら、次の文章を見てください.
ピース✌️
これで昇格に関する二つの文章が終わりました.後に読者と作者は問題1と問題3について意見が分かれました.その時も運んできてください.