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