簡體   English   中英

有沒有辦法以這種方式調用此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM