「あなたはJavaScriptを知らない」 - インテンシブ(B)

知識ポイント

1.字句のステージ

字句範囲は字句スコープフェーズで定義されています。簡単に言えば、レキシカルスコープは、コードブロックスコープ変数を書くときにあなた次第です、どこでコードを処理字句解析は、(ほとんどの場合)変わらない範囲残るときように、意思決定への書き込みを。

// 全局作用域,只有一个标识符:foo
function foo(a){
// foo所创建的作用域,三个标识符:b,a,bar
    var b = a * 2;
    function bar(c){
    // bar所创建的作用域,只有一个标识符:c
        console.log(a,b,c);
    }
    bar(b * 3);
}
foo(2);  // 2,4,12
复制代码

決定に対応するコードを記述する場所の範囲によって気泡の範囲は、それらが徐々に含まれています。機能なしには、親関数の両方に部分的に存在することはできません。

2.検索

エンジンへの気泡の構造と範囲との位置関係機関位置識別子を見つけるために、この情報を使用し、十分な相互位置情報を提供します。

スコープ検索は、識別子の最初の試合で停止します。ネストされたスコープは、製造、同じ名前を持つ多層識別子に定義することができる「シャドーイング」を

グローバル変数へのアクセスは、同じ変数によってマスクすることができるように、自動的に、(例えばブラウザウィンドウオブジェクトなど)グローバルオブジェクトのプロパティとなるグローバル変数はwindow.a方法です。アクセスする方法はありませんときしかし、グローバル変数が隠されていません

唯一の機能によって、そのレキシカルスコープが宣言されたときに関数が呼び出されるとは関係ありませんが、関係なく、それが呼び出されたかの、位置決定はしていました。

3.字句欺きます

パフォーマンスの低下を引き起こす可能性がレキシカルスコープを欺きます。

1.eval

()関数内のeval JavaScriptがパラメータとして文字列を取ることができ、あなたは、コードがその位置に書かれている場合は、あなたのプログラムを書いて実行するために使用されるコードでコードを生成することができます。

原理のeval()は、詐欺の字句です:レキシカルスコープは、実行書き込み期間で修正します

function foo(str,a){
    eval(str); // 欺骗
    console.log(a,b); 
}
var b = 2;
foo("var b = 3",1); // 1,3
复制代码
在严格模式下,eval()在运行时有自己的词法作用域
function foo(str){
    "use strict";
    eval(str);
    console.log(a); // ReferenceError:a is not defined
}
foo("var a = 2");
复制代码

setTimeout()とのsetInterval()は、同じ評価()の結果を用いて達成することができます。

2.with

典型的には、オブジェクトを参照することができる、同じオブジェクトの複数の属性を参照するためのショートカットとして繰り返すと、例えば、繰り返す必要はありません。

var obj = {
    a: 1,
    b: 2,
    c: 3
}
// 改值
obj.a = 2;
obj.b = 3;
obj.c = 4;
// with改值
with(obj){
    a = 3;
    b = 4;
    c = 5;
}
复制代码

次のコードを考えてみます。

function foo(obj){
    with(obj){
        a = 2;
    }
}
var o1 = {
    a: 3
}
var o2 = {
    b: 3
}
foo(o1);
console.log(o1.a); // 2

foo(o2);
console.log(o2.a); // undefined
console.log(a); // 2 -- a 被泄露到全局作用域
复制代码

対象ブロックは字句範囲として扱われてもよいが、ブロック通常varステートメント内部このブロックで範囲を限定されるものでないが、機能付きスコープに追加されています。

概要

1.レキシカルスコープは、スコープは、関数宣言のコードを書くの位置によって決定されることを意味します。どこでどのように彼らは、実装の過程でどのように見えるかを予測することができます宣言、すべての識別子のコンパイルの字句解析フェーズは基本的に知っています。

2.JavaScript二つのメカニズムはレキシカルスコープを「ごまかす」:evalの()とでは、副作用がコンパイル時にスコープの最適化を見つけることができませんエンジンは、より低速に実行するコードを引き起こしている、お勧めできません。

Barabara

何の仕事?

ビューの素人のポイントに生き残るためにすることができ、自己価値を実現するために人間的に可能切り離さへの生活の基本的な必需品は、栄光または昇華のいくつかの種類、現在の私を得るために、仕事の種類は、ちょうど、仕事を少し言っています時にはそれは悲しいですので、私は、彼はバランス感覚を行うことを願って、同じように、多くの場合に注入し、1つの概念は、応答がない、明らかに、仕事は今、私の人生の一部であり、時々私はそれのために幸せになります市職員、弱気、真剣に、真剣ではない、人々技術的な学習、多くの思考、より多くの概要を。

ます。https://juejin.im/post/5d03a440518825504f6db0faで再現

おすすめ

転載: blog.csdn.net/weixin_34163741/article/details/93177205