2016-10-22 21 views
-1

我不明白我爲什麼得到"Uncaught TypeError: ops is not a function"ops持有multiply因此ops()解決爲multiply()和功能multiply()是在範圍內定義。Javascript:存在與變量值同名的函數,但接收typeError,爲什麼?

var product = 1; 
var sum = 0; 
var x = parseInt(prompt("Enter a No. ", 10)); 
var ops = prompt("Addition/ Multiplication", "multiply"); 
var y = x; 

var operation_type = function (ops){ 
    var ops = ops; 
    return ops; 
} 
var ops = operation_type(ops); 
// console.log(ops); 
console.log(ops(x)); 
// ops(x); 

function addition (x) { 
    for (i=0; i< x; i++) { 
    sum = sum + y; 
    y = y - 1; 
    } 
    sum = "Recursive sum of " + x + " is: " + sum; 
    document.getElementById('result').innerHTML = sum; 
} 

function multiply(x) { 
    for (i=0; i< x; i++) { 
    product = product*y; 
    y = y - 1; 
    } 
    product = "Recursive Product of " + x + " is: " + product; 
    document.getElementById('result').innerHTML = product; 
} 

感謝 BT

+0

您在ops中給出參數,所以它是函數。並且ops函數不存在 – Mahi

+1

'promt'只返回字符串(或null),而不是函數。很明顯'ops'不是一個函數。 – Oriol

+0

參見'var ops = operation_type(ops);''這意味着js fun'operation_type(ops)'將執行並返回值到'ops'在非常nex行中,您嘗試執行它作爲函數,但'ops'是變量,而不是函數這就是爲什麼你會得到這樣的錯誤。 – Veer

回答

1
var operation_type = function (ops){ 
    var ops = ops; // useless declaration/assignment 
    return ops; // return original argument value 
} 
var ops = operation_type(ops); 
console.log(ops(x)); 

operation_type只是返回的值是傳入的,一個字符串,並將其分配給ops變量。做ops(x)試圖調用ops作爲一個函數的字符串。你可能想要做的是動態選擇在x上運行的功能。

operation_type函數應該可能返回實際的函數對象。指定名稱的功能可以使用括號表示法來解析(例如:console.log(window[ops](x))):

var operation_type = function (ops){ 
    return window[ops]; 
} 
var ops = operation_type(ops); 
console.log(ops(x)); 
+0

你是對的,我想動態選擇函數,但我不喜歡使用全局窗口對象,有沒有什麼方法可以避免'window'對象,或者如果你想動態選擇功能? –

+0

@bTech將你的函數附加到對象上,使用該對象而不是'window'。 – Joseph

相關問題