2016-10-11 3 views
1

変数namespaceを持っています。その名前空間から関数を呼び出す必要があります。私は変数namespaceの外に関数を書いています。 window[functionName]を使用すると、その関数が呼び出して実行しています。変数名空間または変数名前空間の外で関数を呼び出すためにevalを置き換えます。

変数ネームスペース内に関数を配置すると、その関数が呼び出されないとします。 evalを使用している場合は動作しています。変数namespace.window[funcitonName].call(args)内の関数を呼び出すためのevalの置換は、その関数がグローバルである場合にのみ実行されます。

私の要件は、このようなものです:

var xxx = xxx || function($) { 
 

 
    function onVehicleChange(..., functionName, ....) { 
 
    window[functionName](this, args); 
 
    } 
 

 
    function maruthiVehicle(args) { 
 

 
    } 
 
}

ここに私が動的に関数名を取得しています。ここで私のfunctionNamemaruthiVehicleであるとします。私はここでその機能をハードコーディングしています。

window[functionName]は、が変数namespace(XXX)の中にあるため、window[maruthiVehicle]となります。私がfunction(maruthiVehicle)をこの変数の外に置いたとすると、それはうまくいきます。

したがってwindow[functionName]ここではglobalスコープでのみ動作します。私はevalを使ってみました。変数namepsaceの外側または内側に関数を置くとevalが正常に動作しています。

私はevalを使用しません。私はこのevalの交換が欲しいです。

eval(functionName + "(args)"); 変数内または変数名前空間外の関数の配置に関係なく、my関数呼び出しはトリガを取得する必要があります。

答えて

0
function testGlobalNetworkChange(xyz, $) { 
    console.log("selectoris " + this.id + ',' + "mode is " 
       + xyz+ ',' + "jQuery instance is " + $); 
} 

    var netowrk= network|| (function($) { 
    'use strict'; 
    return { 
     onNetworkChange: onNetworkChange, 
     testnetworkChange: testnetworkChange 
    }; 

    function testnetworkChange(mode, $) { 
     console.log("AttributeSelector is " + this.id + ',' 
        + "mode is "+ mode + ',' + "jQuery instance is " + $); 
    } 

    function solveFunction(functionName, context) { 
     var namespaces = functionName.split("."); 
     var func = namespaces.pop(); 
     for (var i = 0; i < namespaces.length; i++) { 
      context = context[namespaces[i]]; 
     } 
     return context[func]; 
    } 

    function OnNetworkChange(selector, functionName, xyz, $) { 
     var func = solveFunction(functionName, window); 
     $('#' + Selector).change(function(e) { 
      func.apply(this, [xyz, $]); 
     }); 
    } 
})(jQuery); 

//:

は、その使用上の以下のスニペットを参照してください。 network.onNetWorkChange(parameters);

+0

あなたのコメントを削除したり**答えを編集**したり、あなたのコメントに説明を追加して、より明確にすることができます。あなたの答えに答えを記入してください。 –

+1

@あなたの提案に従ってスニークが追加されました。 – Ravi

+0

@スニークコメントも削除されました – Ravi

1

私はあなたが以下のようなコードを構造化することができ信じる:

/* 
 
* Global varibale - a namespace/place holder to keep the entities related to the application 
 
* This goes into the global variable - `window` 
 
*/ 
 
vehicleNamespace = window.vehicleNamespace || {}; 
 

 
/* 
 
* Add functionality into that object 
 
*/ 
 
vehicleNamespace = (function() { 
 

 
    // Create a `local` function. 
 
    var maruthiVehicle = function() { 
 
    console.log("This is Maruthi"); 
 
    }; 
 
    
 
    // Return the object(s) that should be public in `vehicleNamespace` 
 
    return { 
 
    maruthiVehicle: maruthiVehicle 
 
    } 
 
})(); 
 

 
// call the function 
 
window.onload = function() { 
 
    vehicleNamespace.maruthiVehicle(); 
 
};

機能dynamicallyを呼び出すためには、あなたは、要件に基づいてcallまたはbindを使用することができます。テストにあなたの関数を呼び出す

/* 
 
* Global varibale - a namespace/place holder to keep the entities related to the application 
 
* This goes into the global variable - `window` 
 
*/ 
 
vehicleNamespace = window.vehicleNamespace || {}; 
 

 
/* 
 
* Add functionality into that object 
 
*/ 
 
vehicleNamespace = (function() { 
 

 
    var maruthiVehicle = function(input) { 
 
    console.log(input); 
 
    }; 
 

 
    var onVehicleChange = function(functionName, output) { 
 
    // Note: You could also add more validations here to check if it is a `function` 
 
    if (typeof functionName == 'function') { 
 
     functionName.call(this, output); 
 
    } 
 
    } 
 

 
    // Return the object(s) that should be public in `vehicleNamespace` 
 
    return { 
 
    maruthiVehicle: maruthiVehicle, 
 
    onVehicleChange: onVehicleChange 
 
    } 
 
})(); 
 

 
// call the function 
 
window.onload = function() { 
 
    vehicleNamespace.maruthiVehicle("This is Maruthi"); 
 
    vehicleNamespace.onVehicleChange(vehicleNamespace.maruthiVehicle, "Selected Maruthi"); 
 
};

+0

TypeError:functionName.callは関数ではありません。それは動作していません – Ravi

+0

'typeof(functionName)'を使用してパラメータの 'type'をチェックし、それが' function'であることを確認してください。私は上記のコードにそれを修正しました。 –

+0

関数resolveFunction(functionName、context){ var namespaces = functionName.split( "。"); var func = namespaces.pop(); for(var i = 0; i Ravi

関連する問題