2010-08-08 130 views
-1
for (var i in variables) { 
    eval('var ' + i + ' = variables[i]'); 
} 

基本上,我想將變量屬性轉移到局部變量。如何在沒有eval的情況下執行此操作()

是否有使用的eval()

或者其中這些是替代更好:

1.

var _ = variables; 
for (var i = 0; i < 100000; i++) { 
    _.test1(); 
    _.test2(); 
    _.test3(); 
} 

2.

with (variables) { 
    for (var i = 0; i < 100000; i++) { 
     test1(); 
     test2(); 
     test3(); 
    } 
} 

var test1 = variables.test1, 
    test2 = variables.test2, 
    test3 = variables.test3; 
for (var i = 0; i < 100000; i++) { 
    test1(); 
    test2(); 
    test3(); 
} 

4.

for (var i in variables) eval('var ' + i + ' = variables[i]'); 
for (var i = 0; i < 100000; i++) { 
    test1(); 
    test2(); 
    test3(); 
} 
+8

爲什麼在這個世界上你想要這樣做? – 2010-08-08 18:22:38

+0

如果'變量'真的很長,如:namespace.constructors.blah.dramatic.variables 並且變量的內容被引用很多,那麼將它的內容放在局部變量中很有用。 可以使用'with'關鍵字,但有它自己的問題。 該示例很簡單。 – 2010-08-08 18:29:41

+0

你應該避免使用'eval()'util,你知道JS很好,知道什麼時候它是絕對必要的,因爲它的速度慢,而且它的使用通常被認爲是不好的做法。 – xj9 2010-08-08 20:01:21

回答

0

那麼,我會自己發佈答案。

有沒有辦法來設置局部變量不知道該變量的名稱,而不使用eval()...

...但是,使用局部變量(選項3)是最好的方法。

4

通過查看comment看來你主要關注的是其引用數次深度嵌套的對象,避免evalwith我只是建議您使用別名標識符,例如:

// some local scope... 
var foo = namespace.constructors.blah.dramatic.variables; 
// replace foo with something meaningful :) 
foo.method1(); 
foo.method2(); 
foo.property1; 
// etc... 

在這樣的深度嵌套對象都已經得到解決,並引用您的別名會更快,evalwith IMO將比在這種情況下,只有好處,因爲你的問題更多。

+0

謝謝。當然,我認爲這一點。但是,由於變量名稱是已知的,而不是使用別名,我只是重複eval的做法。像,var a = variables.a; var b = variables.b;等等......我認爲這是最有效的方法,但並不像我想的那樣優雅。 eval保存了一些字節,但看起來像一個黑客。用eval設置十幾個變量不應該是明顯的性能明智的。 – 2010-08-08 18:52:14

+3

@Carlos Gil保存「字節」是一個毫無價值的努力。如果您想通過減少範圍鏈查找來優化您的代碼,那麼@CMS擁有的方法就是要走。另外,'eval'(有時'with')速度很慢,不適當使用''with'的副作用使其不值得使用。 – 2010-08-08 19:03:42

+0

@Justin Johnson我很確定,在初始設置局部變量後,它們的訪問速度比其中一個屬性快。含義; foo *的訪問速度比foo.property *快。如果我錯了,請解釋一下。 – 2010-08-08 19:17:42

0

一種替代方法是使對象成爲當前範圍。它不會使性能局部變量,但你可以使用關鍵字this訪問它們:

var variables = { a:42, b:1337 }; 

(function(){ 
    alert(this.a); 
    alert(this.b); 
}).apply(variables); 

這樣做,你是不是抄襲任何東西任何地方,你是直接訪問性能優勢。

+1

這怎麼可能比僅僅給變量分配一個更短的名字更好。您仍然可以直接訪問屬性。 – MooGoo 2010-08-08 20:04:41

+0

@MooGoo:不,如果將屬性複製到本地變量,則不會直接訪問屬性。如果您更改本地變量,則該屬性不會更改。 – Guffa 2010-08-08 20:24:05

+0

我說過「分配變量'一個較短的名字」,即'var v = variables'。 'v'對同一個對象有一個引用,即'變量'引用與'this'持有該引用沒有區別,除了它更簡潔並且不需要不必要的函數調用(如果不慢使用'with')。 – MooGoo 2010-08-08 20:37:36

相關問題