2011-06-03 73 views
-1

有什麼辦法來介紹本地變量「iWantThisHere」在這裏,這樣我就可以調用obj.n()假冒功能本地變量

var obj = { 
    test: "sure", 
    n : function(){ console.log(iWantThisHere); } 
}; 

我試着用:

function fake(methods){ 
    var F = new Function('methods', "var iWantThisHere = 'u have it', obj = {}; for(var meth in methods){ obj[meth] = methods[meth] } return obj;"); 

    return F(methods); } 

console.log(fake(obj), fake(obj).n()); 

我不想在這裏使用全局變量。設想一個模塊化系統,其中每個模塊使用例如一個util類,它例如在App對象中定義。所以我必須輸入例如App.utils.map或類似的東西。如果有一個這個util函數的快捷方式是模塊上下文本身的一個局部變量,那將是很好的。

編輯 ---那裏有沒有辦法做到這一點----

+5

咦?你到底在說什麼? – SLaks 2011-06-03 22:27:03

+0

你完全不清楚你想要這個變量是做什麼,或者做什麼,或者其他任何事情。 – Pointy 2011-06-03 22:27:16

+0

由於範圍鏈的工作方式,你可以在全局範圍內引入這個變量,並且它會被選中 - 除非腳本在本地範圍內明確定義了它自己的版本,在這種情況下,我沒有看到很多希望:函數將始終使用它定義的範圍中的函數,如果它存在的話。 – Reid 2011-06-03 22:28:29

回答

1

介紹閉包:

var obj = (function(){ 
    var R = {}; 

    R.iWantThisHere = 5; 

    R.log = function() { 
     console.log(R.iWantThisHere); 
    } 

    return R; 
})(); 

演示:

> obj.log() 
5 
> obj.iWantThisHere = 6 
> obj.log() 
6 

這是最常見的(我敢說推薦)的方式做的JavaScript編程,通過創建功能來限制變量的作用域。這是必要的,因爲JavaScript沒有塊級的範圍。

1

如果你的問題是,「我怎樣才能東西一個新的命名值轉換成alreay,現存的範圍是什麼?」,答案是你不能。你能來最接近的是:

var obj = (function() { 
    var iWantThisHere = "whatever"; 
    return { 
    test: "sure", 
    n: function() { var x = iWantThisHere + "yaay I have my special variable"; } 
    }; 
})(); 

這使你的「目標文件」,你在你原來的例子有,加上在該對象定義的任何功能,您就可以訪問「相對全局」變量他們都分享。

+0

好吧thx,我嘗試了一些hacky函數,將傳入的obj打包成json類似的字符串,並將它解壓到新的作用域中,但這不是一個合適的解決方案 – 2011-06-03 22:39:11

1

有什麼特別的理由要這麼做嗎?爲什麼不只是在obj.n的函數中添加一個參數?

var obj = { 
    test: "sure", 
    n : function(iWantThisHere){ console.log(iWantThisHere); } 
}; 

obj.n("yeah"); 

或者更簡單(雖然作用域變得醜陋):

var iWantThisHere = "dance time"; 
var obj = { 
    test: "sure", 
    n : function(){ console.log(iWantThisHere); } 
}; 
obj.n(); 

或者有倒閉,再加上你怎麼分開他們的公共和私人部分的一些細節:

var obj = (function() { 
    var privateVariable = "i'm private"; 

    function privilegedMethod() { 
    }; 

    return { 
    iWantThisHere: "", 
    test: "sure", 
    n: function() { 
     console.log(this.iWantThisHere); 
    }, 
    publicVariable: "i'm public", 
    publicMethod: function() {} 
    }; 
})(); 

obj.iWantThisHere = "hi"; 
obj.n(); // logs "hi" 
obj.addedMethod = function() { console.log("I've been added"); } 
obj.addedMethod(); // logs "I've been added"; 
console.log(obj.privateVariable); // logs undefined (unavailable outside closure) 
console.log(obj.publicVariable); // logs "i'm public" 

的其他答案也包括封閉符號。但是底線是,如果你可以隨處注入新的變量,閉包和受限範圍在JavaScript中將毫無意義。

+0

我不確定他是否想要提供它一些真正的日誌記錄,但如果他不帶任何參數地調用obj.n(),那麼至少會使其記錄未定義。再次不清楚他究竟想要什麼。 – Robert 2011-06-03 22:37:47

+0

感謝您關閉課程,但您錯過了這一點 – 2011-06-03 23:05:49