![](/img/trans.png)
[英]Is there a safe way to call `call` to call a function in JavaScript?
[英]is there a way to call this javascript function in this way?
我希望能夠調用像item_edit.say這樣的函數,它以字符串形式在窗口對象上傳遞了(像下面的最后一行):
var arc={ view: { item_edit: {} } };
arc.view.item_edit={
say_hello: function(){
alert('hello there');
}
}
var f_name='say_hello';
var g_name='item_edit.say_hello';
var str=window.arc.view.item_edit[f_name](); // <- this works
var str2=window.arc.view[g_name](); // <- this is what I'm interested in; curently doesn't work
關於如何使它起作用的任何想法?
提前
編輯#1我想我應該補充一點,也許我不想做評估,盡管我越看越多,這也許是有道理的(實際上是進行評估的意思)。
當然。 如果未由編譯器優化,則Google閉包庫在其goog.provide
函數中會執行類似的操作。
function callDotted(obj, path, args) {
var parts = path ? path.split('.') : [];
var i, n = parts.length;
for (i = 0; i < n - 1; ++i) {
obj = obj[parts[i]];
}
var fn = i < n ? obj[parts[i]] : obj;
return fn.apply(obj, args);
}
然后在Date.now
返回當前時間戳的瀏覽器上,
callDotted(window, 'Date.now', [])
返回當前時間戳。
這是使用.reduce()
的一種方法。
var str2 = g_name.split('.').reduce(function(obj, key) {
return obj[key];
}, window.arc.view);
您需要對舊版瀏覽器進行填充,並根據需要進行安全檢查。
如果您經常這樣做,我會將功能添加到您的庫中,以便您可以重用它。
function keyToObj(obj, key) {
return obj[key];
}
然后像這樣使用它:
var str2 = g_name.split('.').reduce(keyToObj, window.arc.view);
正如@MikeSamuel指出的那樣,使用這種方法時,已執行函數的this
值存在問題。
為了解決這個問題,我們可以制作另一個特別適合於方法調用的版本。
function keyToMethod(obj, key, i, arr) {
return i === arr.length - 1 && typeof obj[key] === "function"
? function() {
return obj[key].apply(obj, arguments);
}
: obj[key];
}
現在,我們的函數返回一個函數,該函數從適當的對象調用該方法。
var str2 = g_name.split('.').reduce(keyToMethod, window.arc.view)();
我們可以進一步增強返回的函數,以檢查this
值是否為默認值,如果不是,則使用提供的值。
這個怎么樣:
var str2 = eval('window.arc.view.' + g_name + '()');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.