2016-02-26 48 views
1

我正在使用history.js。在pushState的功能stateObj,我想添加一個引用函數(Car.init(),或Boat.init()。在C++中,我相信我可以用一個函數指針。以字符串表示的對象字面上的調用函數 - JavaScript

然後在window.onpopstate,我想引用函數和調用它我可以讀取字符串(Car.init(),但那麼我怎樣才能調用函數?我不想使用eval

+0

請勿引用,也不要調用函數。 – dandavis

+0

@JeremyBanks:當然,我們不會在JavaScript中稱它們爲「指針」,我們稱之爲函數*對象* :-) – Bergi

+0

您應該可以調用傳遞給pushState()的函數。如果不是,則將函數放在全局對象上,並將屬性名稱傳遞給pushState,使用該鍵在onpopstate() – dandavis

回答

0

你可能不應該,但如果你想要調用一個函數基於全球虛線路徑名稱,可以這樣完成:

function callFunction(name, var_args) { 
 
    // break the string into individual property/method names 
 
    var parts = name.split('.'); 
 

 
    // start with a reference to the global object 
 
    var target = window; 
 
    var previousTarget = null; 
 

 
    for (var i = 0; i < parts.length; i++) { 
 
    // keep a copy of the previous reference to use as the `this` value 
 
    previousTarget = target; 
 

 
    // change the reference to the next named property 
 
    target = target[parts[i]]; 
 
    } 
 

 
    // grab the remaining arguments 
 
    var args = Array.prototype.slice.call(arguments, 1); 
 

 
    // call the target function, with previousTarget as the subject, using args 
 
    return target.apply(previousTarget, args); 
 
} 
 

 
// This is in the top-level/global scope. This won't work for a local definition. 
 
var MyApp = { 
 
    currentUser: { 
 
    name: 'Joe', 
 
    displayName: function(greeting) { 
 
     alert(greeting + " ," + this.name + "!"); 
 
    } 
 
    }, 
 
    openBar: function() { 
 
    alert("The Foo Bar is now open for business!"); 
 
    } 
 
}; 
 

 
var functionName = 'MyApp.currentUser.displayName'; 
 
callFunction(functionName, "Hello");

這比使用eval(上避免了其良好的通話)更安全,但仍然是相當古怪的和非常困難的JavaScript解釋器來優化。相反,推薦的方法是使用函數的引用(指針)。這可能與您在C++中所做的相似。如果函數不使用this(即,如果它是靜態函數,而不是方法),則可以直接引用該函數。

var open = MyApp.openBar; 
open(); 

如果它確實有一個this值,你就需要使用.bind()方法來保持與它附着於物體的關聯。

var display = MyApp.currentUser.displayName.bind(MyApp.currentUser); 
display("Greetings"); 

如果通過其他參數來.bind(),你還可以指定將用於調用該函數的參數領先。

var displayHello = MyApp.currentUser.displayName.bind(MyApp.currentUser, "Hello"); 
displayHello(); 
+0

它是對象字面量的靜態函數,如:var MyGreatObj = {myStaticFunction:function myStaticFunction(foo){// do something}}。那麼,我如何才能'直接引用該函數',正如你所說的那樣?謝謝! – dt1000

+0

'var reference = MyGreatObject.myStaticFunction;',這樣你以後可以'引用(bar)'。你可以用同樣的方式識別它,但是放棄'(參數列表)'。 –

+0

當然!謝謝。 – dt1000

相關問題