スコープ
J の私なりの要約として、スコープはそれほど長くはなりません。この記事は主に過去と次のリンクです。
後で、実行コンテキスト、クロージャ、およびその他の関連トピックについて説明しますが、内容が多くなりすぎないように、スコープ部分は個別にまとめます。
#目次
(無料学習の推奨事項: JavaScript ビデオ チュートリアル)
序文
JavaScript 内部スキル シリーズ:1. 範囲の定義
このセクションの内容をまとめたマップ
注: スコープに加えて、最新のエンタープライズ レベルの Vue3.0/Js/ES6/TS/React/Node なども含まれます。 2020 チュートリアルの実践的なビデオ、ここをクリックして無料で入手します。初心者の方は入力しないでください。
#1.1 で使用される一般的な説明
function func(){ var a = 100; console.log(a); // 100}console.log(a) // a is not defined a变量并不是任何地方都可以被找到的
JavaScriptは、静的スコープである字句スコープ(字句スコープ)を採用しています。
##関数のスコープは、関数が定義されるときに決定されます。関数内で定義された変数
function fn(){ var name = '余光'; console.log(name);}console.log(name); // ?fn(); // ?
Global: どこからでもアクセス可能 到達したオブジェクトのスコープはグローバルです。
関数の外で定義された変数var a = 100;console.log('a1-',a);function fn(){ a = 1000; console.log('a2-',a);}console.log('a3-',a);fn();console.log('a4-',a);
注: ES6 以降 ブロックレベル範囲が提案されていますが、それらの違いについては後で説明します。
2.1 字句スコープの理解
var value = 1;function foo() { console.log(value);}function bar() { var value = 2; foo();}bar();
定義に基づいて分析しましょう:
はbar
関数を実行し、ローカルスコープは関数内で形成されます ;値変数を宣言し、値を代入します 2
foo
関数を実行します。
字句スコープの規則に従って、関数が定義されると、 は 1
わかりましたか?外?
var str = '全局变量';function func(){ console.log(str+1); function childFn(){ console.log(str+2); function fn(){ console.log(str+3); }; fn(); }; childFn();}func();// 全局变量1// 全局变量2// 全局变量3
var a = 100;function fn(){ a = 1000; console.log('a1-',a);}console.log('a2-',a);fn();console.log('a3-',a);// a2- 100 // 在当前作用域下查找变量a => 100// a1- 1000 // 函数执行时,全局变量a已经被重新赋值// a3- 1000 // 全局变量a => 1000
2.3 ローカル スコープ
ローカル スコープは通常、固定コード フラグメント内でのみアクセスできます。最も一般的なのは関数ユニットです: function fn(){
var name="余光";
function childFn(){
console.log(name);
}
childFn(); // 余光}console.log(name); // name is not defined
3.1 何が起こるか変数を探すときは?
は、最初に現在のコンテキストの変数オブジェクト から検索します。
見つからない場合は、親 (先頭の親) から検索します。字句レベル) レベル)実行コンテキストの変数オブジェクトを検索します ;
グローバル コンテキストの変数オブジェクト (グローバル オブジェクト) を常に検索します;undefined
ReferenceError
。3.3 作用域嵌套
既然每一个函数就可以形成一个作用域(词法作用域
|| 块级作用域
),那么当然也会存在多个作用域嵌套的情况,他们遵循这样的查询规则:
在《你不知道的Js》中,希望读者可以将作用域的嵌套和作用域链想象成这样:
四、思考与总结
4.1 总结
4.2 思考
最后,让我们看一个《JavaScript权威指南》中的两段代码:
var scope = "global scope";function checkscope1(){ var scope = "local scope"; function f(){ return scope; } return f(); // 注意}checkscope1();var scope = "global scope";function checkscope2(){ var scope = "local scope"; function f(){ return scope; } return f;}checkscope2()();
两段代码的结果都是"local scope",书中的回答是:JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。
但是它们内部经历的事情是一样的吗?
相关免费学习推荐:javascript视频教程
以上がマインドマップ+コード例でスコープからスコープチェーンまでの知識ポイントが一目瞭然!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。