2014-01-13 125 views
8

我有困難調用另一個函數的內部函數時,它的名字是在一個變量的一個函數裏的JavaScript調用函數遠沒有成功。搜索現有的答案沒有任何東西。它與this[x]()一起使用,如果b()直接放置在對象內部。我想保留b()作爲function a()中的函數,因爲function a()中的變量範圍,否則我需要將許多參數傳遞給b()通過變量名

//// 重複的問題:Quentin在這個線程提供了一個更優雅的答案imo。

+0

嘗試'window [x] .apply(this,[param1,param2])'[apply](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/申請) – Catalin

+1

@RaraituL'b'將是s應付,所以你不能這樣做 –

+0

@PaulS。 'x'的定義方式,它將在'window'對象 – Catalin

回答

15

使用匹配變量名稱的字符串訪問任意變量沒有明智的方法。 (對於非常差的方式,請參閱eval)。

[x](); //不起作用

你試圖調用數組作爲函數

既不this[x]()

功能是不是inner對象的屬性。

window[x]()

由於它不是一個全球性的,它不是窗口對象的屬性任一。


如果您需要根據字符串變量的值調用函數,然後在對象中組織函數並從中訪問它們。

function b() { 
    alert('got it!'); 
    } 
    var myFunctions = { 
     b: b 
    }; 
    x = 'b'; 
    myFunctions[x](); 
+0

var myFunctions = { b:b }; 這樣做! – Gonki

3

試試這個。目前,您正在將字符串分配給變量x,而不是函數變量。

x = b; 
x(); 
+0

也許它可以工作,如果值b直接分配。它來自一個計算。這個例子中不是真正的代碼。 – Gonki

1

函數聲明b將在指定爲a匿名函數表達式的閉合被捕獲。

  1. var在閉合時,沒有(提供的JavaScript對象其被分配類似於用在全球範圍window發生的屬性。
  2. 有效寫入函數聲明var s 名稱函數

如果你真的想通過字符串訪問一個變量(即b),你要麼需要創建一個對象持有b類似於你做了什麼爲a,或(和可能危險地)依靠eval"b"轉換爲b

如果您不能創建整個對象名列前茅的時候,你可以使用這種格式

/* in (higher?) scope */ 
var fnRef = {}; 
// now when you 
function b() {/* define as desired */} 
// also keep a ref. 
fnRef['b'] = b; 
// fnRef['b']() will work **after this line** 
1

假設你的代碼是這樣的:

//instead of x = 'b' 
x = function(){} 

那麼你解決方案可能是這樣的:

var obj = {} 

obj.f = function() { 
    var inner = { 
    a: function() { 
     function b() { 
     alert('got it!'); 
     } 
     b(); // WORKS AS EXPECTED 
     //you can define it as a variable 
     var x = function(){}; 
     //and call it like this 
     x(); 

     //or define it like this 
     this[x] = function(){}; 
     //and call it like this 
     this[x](); 

     //but you are creating an array [x] which is not a function 
     //and you are trying to call an array???? 
     [x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc. 
    } 
    } 
    inner.a(); 
} 

obj.f(); 
2

問題是你的signment

使用x = b而不是x = 'b'來指定函數對象,因爲後者只是將字符串賦值給x。

一旦你解決你的任務,你可以調用功能

x(); 
a.x(); 
a[x](); 

+0

您必須將'a [x]()'更改爲'a [「x」]();',除非x是一個帶有「x」值的字符串變量。 –

2

您應該陣列功能,然後在你的變量使用的名稱如下訪問:

var obj = {} 

obj.f = function() { 
    var inner = { 
    a: function() { 
     // set up the possible functions: 
     var myFuncs = { 
       b: function b() {alert('got it!');} 
       }; 
     //b(); // WORKS AS EXPECTED --> commented this code 
     x = 'b'; 
     myFuncs[x]();  
    } 
    } 
    inner.a(); 
} 
+0

@Gonki您需要對此解決方案的代碼進行最小程度的更改 –