実行コンテキストは、スコープを形成する現在のコードの実行環境として理解できます。
- スコープ: 段落 < 関数
- グローバル: 変数定義、関数宣言 (< スクリプト > 内)
- 関数: 変数定義、関数宣言、this、引数
console.log(a);var a = a; fn('dong');function(){}
このコードでは、var a と関数 fn() が実行コードの前に置かれるようになりました
++this++
var a = { name:'A', fn:function(){ console.log(this.name) } } a.fn();//this === A a.fn.call({name:'B'})//this === {name :'B'}var fn1 = a.fn; fn1(); //this==windowfn1;
this は実行中に実行されます To値を確認します。定義時は確認できません
コンストラクタとして実行
function Foo(name){ this.name = name; }var f = new ('dong');
オブジェクト属性として実行
var obj = { name :'a', printName:function(){ console.log(this.name); } } obj.printName(); //a
通常の関数として実行
function fn(){ console.log(this);//this===window}
call apply binding
//callfunction fn1(name,age){ alert(name,age); console.log(this); } fn1.call({x:100},'dong',200);//弹出dong 200//打印{x:100}//call将this指向第一个参数的值//常用它来改变函数的this值//apply与call类似//bindfunction fn1(name,age){ alert(name); console.log(this); } fn.call({x:100},'dong',20);//this为{x:100}var fn2 =function (name,age){ alert(name); console.log(this); }.bind({y:200});//必须用函数表达式的方式fn2.call('dong',20); //this为{y:200}
++Scope++
//无块级作用域if(true){ var name = 'dong'; } console.log(name);//函数和全局作用域var a =100; function fn(){ var a =200; console.log('fn',a); } console.log('global',a);fn();
++Scopechain++
自由変数は親スコープ内でそれを探し続け、スコープチェーンと呼ばれるチェーン構造を形成します。
var a = 100;function(){ var b = 200; console.log(a);//当前作用域中没有定义a,a就是自由变量 console.log(b); }
var a = 100;function F1(){ var b =200; function F2(){ var c = 300; console.log(a); console.log(b); console.log(c); } }
++Closure++
戻り値としての関数
渡すパラメータとしての関数
function F1(){ var a = 100; return function(){ console.log(a); } }var f1 = F1();//表示变量f1是一个函数var a = 200; f1(); //100//全局里的a与在F1作用域里的a是没有关系的,一个函数的父级作用域是它定义时候的作用域而不是它执行的作用域,所以a这个自由变量直接在它的父级作用域中直接找到。
変数プロモーションの理解
これを説明する いくつかの異なる使用シナリオ
- クリックすると < タグが作成されます。対応するシーケンス番号
function F1(){ var a = 100; return function(){ console.log(a); } }var f1 = F1();function F2(fn){ var a = 200; fn(); } F2(f1);//100
//考察作用域var i,a;for(var i = 0;i<10;i++){ a = document.creatElement('a'); a.innerHTML = i +<br/>; a.addEventListener('click',function(e){ e.preventDefault(); alert(i); //自由变量需要从父级作用域获取值 }) document.body.appendChild(a); }//这时候监听事件里的函数的自由变量,已经变为10了,所以,不管点击哪个它的序号都是10
//正确方法var i;for (i = 0;i < 10;i++){ (function(i){ var a = document.creatElement('a'); a.addEventListener('click',function(e){ e.preventDefault(); alert(i); }) document.body.appendChild(a); })(i);//自调用函数立即执行}//(function(i){})(i)//自执行函数,就是不用调用,只要定义完成就能立即执行的函数
以上がJS スコープ チェーンとクロージャの例の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。