js閉パケットの理解および閉パケット中のthisの理解

10512 ワード

JAvascript閉パッケージ、this
2016-01-25 
js pl
閉包は実はよく理解されていますが、thisと閉包をよく縛っているので、理解の難しさが増しています.彼らを別々に考えれば、ずっとはっきりしています.
クローズドパッケージ
閉パッケージはjsの創始者ではなく、schemer、rubyなど多くの言語で閉パッケージをサポートしています.閉パケットがなければ,jsのような高次関数特性をサポートする言語は悪夢である.
静的作用域ダイナミックドメイン
var name = "xiaofu";
var person = function(lastname){
	var name = 'yang';

	function personName(){
		return name + lastname;
	}
	return personName;
}
var pName = person();
pName("xiaoming");

jsは関数の役割ドメインであり、functionは役割ドメインであるため、personNameはpersonという関数の役割ドメインにあります.しかし、呼び出されたのはこの役割ドメインの外です.では、personNameが実行されると、その中のnameはpersonという役割ドメインですか、それとも最外層の役割ドメインですか.
静的役割ドメインであればpersonの中のnameが呼び出され、動的役割ドメインであれば外層のnameが呼び出される(「xiaofu」).「yang」ではありません.
閉パケットは静的役割ドメインを実現するための方法であり、関数とその宣言時の役割ドメインを閉パケットで保存することで、呼び出し時に取得されるのは、呼び出し時の役割ドメインではなく、宣言時に存在する役割ドメインである.
this
thisは変数とは少し異なります.すなわち、thisはダイナミックな役割ドメインに似た状況を採用しています.jsにはすべてオブジェクトがあるので、関数もあるオブジェクトのメソッドであり、指定が表示されていない場合はグローバルオブジェクトです.
var person = {
	fullname: function{
		console.log(this);
	},
	printAge: function(){
		console.log(this);
	}
}
person.fullname();		//this  person
var age = person.printAge;
age();					//this  window(    )

personprintAgeはageに値を割り当てた後、age()を実行します.この場合、ageは指定した呼び出しオブジェクトを表示しない場合、デフォルトはwindow(ブラウザ環境)です.だからthisは存在する環境を宣言するわけではありません.
矢印関数(es 6)
Es 6には矢印関数が追加され、functionで宣言された関数とは異なり、thisは使用する宣言時のコンテキストのthisである.また、apply、callなどで変更することはできません.