call(this)によるクローズドの再理解

2551 ワード

callによるクローズドの再理解.md
変数のスコープ
グローバル変数ローカル変数
Javascript言語の特殊な点は、関数内部で直接大域変数を読み取ることができることです.
関数の外部では関数内のローカル変数を読めません.
関数内部で変数を宣言する場合は、必ずvarコマンドを使用します.使わないなら、実際にグローバル変数を宣言しました.
(function(){……}).call(this);

(function(){……})();//        ,      ,          

(function(a){c = 1; alert(this.c);})//     
(function(a){this.c = 1; alert(this.c);})() //alert(“1”);

(function(){c = 1; alert(this.c);}).call(this);//alert(“1”);

(function(a){c = a; alert(this.c);}).call(this,”5”)//alert(“5”);
試してみたら何の役にも立たないです.
次の例を見てください.
var a = {
    b : function(){
        this.c = 1;//   this  b
    }
}

> a.c   //undifined
> a.b();  //    b  ,this   a
> a.c   //1
> this.c;  //undifined    this window
> a.b.call(this) //   this   window
> this.c  //1
> a.c  //1
> c   //1

(function(){var a = {
b : function(){
this.c = 1;// this b
}
}
this.d = 3; alert(this.c);})()

(function(){var a = {
b : function(){
this.c = 1;// this b
}
}
this.d = 3; alert(this.c);}).call(this)

http://i.h-won.com/post/2013-08-29/40052244462
https://github.com/klamtlne/Validator
W 3 School上で説明したように、call()方法は古典的な対象と偽る方法と最も似ている方法である.
function sayColor(sPrefix,sSuffix) {
    alert(sPrefix + this.color + sSuffix);
};

var obj = new Object();
obj.color = “blue”;

sayColor.call(obj, “The color is “, “a very nice color indeed.”);

//”The color is blue, a very nice color indeed.
実例2:
function ClassA(sColor) {
    this.color = sColor;
    this.sayColor = function () {
        alert(this.color);
    };
}

function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.call(this, sColor);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

var objA = new ClassA(“blue”);
var objB = new ClassB(“red”, “John”);
objA.sayColor();
objB.sayColor();
objB.sayName();