Functionの応用

1861 ワード

Function()ビルダーが作成した関数は、関数の直接量声明、匿名関数とは異なり、任意の位置で作成されたインスタンスは、作成されたグローバルクローズドにあります.理由は、Function()コンストラクタから入ってきたパラメータがすべて文字列であるため、関数の局所変数と参照を確立する必要がないからです.これによってもたらされる利点の一つは、任意の多層の関数の内部において、関数をFunction()によって作成することによって、クローズドが解放されなくなるということである.
  、

function myFun(){
	var value = "this is local";
	var foo = function(){
		console.log(value);
	}
	foo(); //this is local
			
	(function(){
		console.log(value);
	})()    //this is local
			
	function f1(){
		console.log(value);
	}
	f1();    //this is local
			
	var f2 = new Function('console.log(value)');
	f2();  //this is global
}
myFun();
  、

var obj = new Object();
var events = {m1:"clicked",m2:"changed",m3:"mousemove"};
for(e in events){
	obj[e] = function(){
	    console.log(events[e]);
        }
}
		
for(i in obj){
	obj[i]();
}

//  :
//mousemove
//mousemove
//mousemove
  、

var obj = new Object();
var events = {m1:"clicked",m2:"changed",m3:"mousemove"};		
for(e in events){
	obj[e] = new Function("console.log(events['"+e+"'])");
}
for(i in obj){
	obj[i]();
}



//  :
//clicked
//changed
//mousemove
解決例二のルートは以下の方法があります.

var obj = new Object();
var events = {m1:"clicked",m2:"changed",m3:"mousemove"};		
for(e in events){
		obj[e] = function(aValue){
			return function(){
				console.log(events[aValue]);
			}
		}(e)
}

  

for(e in events){
    function(){
        var aValue = e;
        obj[e]=function(){
            console.log(events[aValue]);
        }
    }();
}

  

for(e in events){
    (obj[e] = function(){
        console.log(events[arguments.callee.aValue]);
    }
    ).aValue=e;
}



for(i in obj){
    obj[i]();
}
//  :
//clicked
//changed
//mousemove