所以说我有一个数组:
我可以通过调用一个元素来告知其位置吗?假设它是一个函数。
var h = ["0", "1", () => { /* code */ }, "3"];
匿名函数将自我评估为"2"
答案 0 :(得分:4)
我们可以通过创建一个函数并覆盖其功能来使用代理。我们还需要在阵列上创建一个代理。这可以通过代理内的代理来完成。一种修改函数,另一种修改数组。然后我们可以像普通的数组函数一样调用它。
// The original function
function TheFunction(idx, arg1) {
console.log('Index:', idx, '--', 'Argument:', arg1)
return Math.round(Math.random() * 100000)
}
let h = ["0", "1", TheFunction, "3", TheFunction];
// Create a Proxy on the array
h = new Proxy(h, {
// Execute when an array item is accessed
get(target, prop) {
// Test if the item is a function
if(typeof target[prop] != 'function') throw new Error('Not a function!')
// Create a new Proxy on the original function
return new Proxy(TheFunction, {
// When the function gets called run this instead of what was actually called
apply(target, thisArg, arguments) {
return target(prop, ...arguments)
}
})
}
})
console.log('Result:', h[2]('hello'))
console.log('Result:', h[4]('world'))
否则,我们将无法直接执行它。函数不知道它们在脚本中的位置,也不知道它们是否在全局范围,窗口,数组,对象等中。您需要一个中间人或助手,在这种情况下,我们可以使用{ {1}}具有第二个参数,即项目的索引。然后,您可以将其作为这样的参数传递:
forEach
如果您的数组具有一个函数,则可以使用var h = ["0", "1", (idx) => { console.log(idx) }, "3"];
h.forEach((itm, idx) => {
if(typeof itm == 'function') {
itm(idx)
}
})
执行类似的任务。但是,您仍然需要将索引传递给函数,以便函数可以使用它:
findIndex
不可能的另一个原因是因为可以引用函数,因此可以在数组或其他地方使用它。如您在这里看到的,我们引用了一个函数,以及一个在数组外部调用的函数。被调用的函数不知道该调用是来自数组还是数组之外。
var h = ["0", "1", (idx) => { console.log(idx) }, "3"];
let idx = h.findIndex(i => typeof i == 'function')
idx > -1 && h[idx](idx)
答案 1 :(得分:-1)
是的,您可以循环数组并在内部检查元素类型是否为函数:
var h = ["0", "1", () => {}, "3"]
for(var i = 0; i < h.length; i++){
if(typeof h[i] === 'function'){
console.log(i)
}
}
如果是,只需获取元素的索引。