【6】JavaScript関数が高度である.コンテキストと実行コンテキストスタック、変数のリフティング(図解+典型的な例分析)を実行する.
4917 ワード
JavaScript関数は高級です.コンテキストと実行コンテキストスタック(図解+典型的な例分析)を実行します.
変数の昇格と関数の昇格変数宣言の昇格 は、 にアクセスすることができる.値: 関数宣言の昇格 は、 を呼び出すことができる.値:関数定義(オブジェクト)
!注意:問題:変数アップと関数アップはどのように発生しますか? これはJavaScriptで文脈の働き方を実行しているからです.関数と変数は、優先的に上昇します.これは関数がより前の位置に引き上げられることを意味する.JavaScriptは、初期化を向上させる代わりに、ステートメントのみを向上させます.
コンテキストを実行
コンテキスト個数=n(呼び出す関数個数)+1(グローバル実行コンテキスト)を実行します.グローバルコード 関数コード グローバル実行コンテキストは、グローバルコードを実行する前に、 として決定する.は、グローバルデータを前処理する. に追加されます. である. は、グローバルコード の実行を開始する.
関数実行のコンテキストは、関数を呼び出し、関数を実行する前に、対応する関数を作成してコンテキストオブジェクト を実行する.は、ローカルデータを前処理する. モダリティ変数=>赋値(実参)=>を実行コンテキストの属性として追加します. として追加されます. に追加されます. として追加されました. は、関数コード の実行を開始します.
コンテキストスタックを実行
理解するは、グローバルコードが実行される前に、 を管理するスタックを作成する.は、グローバル実行コンテキスト( に追加する.は、関数実行コンテキスト作成後、スタック に追加する.は、現在の関数が実行された後、スタックトップのオブジェクトを除去する .すべてのコードが実行された後、スタックには しか残っていません.
プロセス分析ブレークポイント調整ツールで実行コンテキストコールスタック を確認する.
面接問題
タイトル1:再帰的に呼び出す実行コンテキスト順番に何を出力しますか? 全体の過程でいくつかの実行コンテキストが発生しましたか? デバッグの表示:
問題2:関数の昇格は変数の昇格より優先し、変数宣言によって上書きされませんが、変数の割当値によって上書きされます.
変数の昇格と関数の昇格
var
によって定義された(ステートメント)変数によって、ステートメントを定義する前にundefined
/*
: undefined
*/
var a = 3
function fn() {
console.log(a) // undefined fn() , var , undefined
var a = 4
console.log(a) // 4
}
fn()
console.log('----')
開発ツールのコードデバッグツールでブレークポイントを設定できます.a
の値の変化.function
によって宣言された関数によって、関数宣言の前に直接console.log(b) // undefined var b
fn2() // fn2() function fn2
fn3() // var fn3
var b = 3
function fn2() {
console.log('fn2()')
}
var fn3 = function () {
console.log('fn3()')
}
!var a = 3
、var fn = function(){ }
は、var
によって宣言された限り、変数宣言の向上であり、値は全部undefined
である.!注意:
var fn = function(){ }
は変数宣言の昇格に属し、関数宣言の昇格ではありません.コンテキストを実行
コンテキスト個数=n(呼び出す関数個数)+1(グローバル実行コンテキスト)を実行します.
// , , Window
console.log(a1, window.a1) // undefined undefined
window.a2() // a2()
console.log(this) // Window
var a1 = 3
function a2() {
console.log('a2()')
}
console.log(a1) // 3
コード分類(位置)window
をグローバル実行コンテキストvar
により定義されたグローバル変数=>undefined
は、window
属性function
によって宣言されたグローバル関数=>割当値(fun
)は、window
に追加された方法this
=>割当て(window
)関数実行のコンテキスト
arguments
=>割当値(実際参照リスト)は、実行コンテキストの属性var
で定義された局所変数=>undefined
=>実行コンテキストの属性function
によって宣言された関数=>割当値(fun
)=>実行コンテキストの属性this
=>割当値(呼び出し関数のオブジェクト)コンテキストスタックを実行
理解する
JS
エンジンは、すべての実行コンテキストオブジェクトwindow
)の決定後、スタック(スタック)window
プロセス分析
// 1.
var a = 10
var bar = function (x) {
var b = 5
// 3. foo
foo(x + b)
}
var foo = function (y) {
var c = 5
console.log(a + c + y)
}
// 2. bar
bar(10) // 30
面接問題
タイトル1:再帰的に呼び出す実行コンテキスト
console.log('gb: ' + i)
var i = 1
foo(1)
function foo(i) {
if (i == 4) {
return
}
console.log('fb:' + i)
foo(i + 1) // :
console.log('fe:' + i)
}
console.log('ge: ' + i) // ge:1
5
=4
+1
問題2:関数の昇格は変数の昇格より優先し、変数宣言によって上書きされませんが、変数の割当値によって上書きされます.
console.log(foo) // ƒ foo() {console.log(" ")}
console.log(foo()) // undefined
function foo() {
console.log(' ')
}
var foo = 3
console.log(foo) // 3
console.log(foo()) // foo is not a function
に相当するfunction foo(){
console.log(" ")
} //
var foo // , , foo undefined,
console.log(foo) // ƒ foo() {console.log(" ")}
console.log(foo()) // undefined
foo = 3 // foo 3,
console.log(foo) // 3
console.log(foo()) // foo is not a function, foo=3
問題3:グローバル環境を考察するときの変数のアップグレードif (!(t in window)) {
var t = 1
}
console.log(t) // undefined
t in window
// true
その理由は、変数t
がグローバル環境の最上部に引き上げられ、キーワードvar
を介してグローバルスコープで宣言される変数がグローバルオブジェクトの属性として使用されることにあり、上のコードJavaScriptは、実際にはこのように解析される.var t
if (!(t in window)) {
var t = 1
}
console.log(t) // undefined
問題4(いい問題)var c = 1
function c(c) {
console.log(c)
var c = 3
}
c(2) // c is not a function
注意:関数がc()
に昇格し、関数全体が向上します.上のコードは下記のようになります.function c(c) {
console.log(c)
var c = 3
}
var c
c = 1
c(2) // c is not a function
関数のコードはまったく実行できません.