2012-09-27 42 views
2

我想執行存儲在變量中的函數並將params傳遞給它。但是,在.apply行上,我收到錯誤; Uncaught TypeError: Cannot call method 'apply' of undefined執行窗口[func] .apply(this,args)

小提琴:http://jsfiddle.net/valamas/vzesm/

function target(msg) 
{ 
    alert(msg); 
} 

function mainfunc (func) 
{ 
    var args = new Array(); 
    for (var i = 1; i < arguments.length; i++) 
     args.push(arguments[i]); 

    console.log('args: ' + args); 

    //-- different attempts 
    window[func].apply(this, args); 
    //window[func].apply(null, Array.prototype.slice.call(arguments, 1)); 
    //this[func].apply(this, Array.prototype.slice.call(arguments, 1)); 
} 


$(function() 
{ 
    console.log('\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n'); 
    console.log('ready'); 
    mainfunc('target', 'hello,', 'there!'); 
});​ 

回答

3

的jsfiddle不把JS到全球範圍,所以target實際上不是的window的屬性。

添加此代碼會使你的腳本工作:

window.target = target; 

或者更明確:

window.target = function() { ... 

演示:http://jsfiddle.net/Blender/vzesm/3/

+5

給出無論它所說的那樣,如果你改變的onload爲「無包裝 - 頭」它的工作原理 –

+0

這可能與'(功能(將其包裝){...} )();'wrapper。我不知道無包裝的選項,謝謝。 – Blender

2

這是因爲在的jsfiddle的JavaScript被執行在不同的範圍內。 如果加載jQuery,您的代碼將在螢火蟲控制檯中工作。對於你的jsfiddle必須重寫以下

target = function(msg) 
{ 
    alert(msg); 
} 

function mainfunc (func) 
{ 
    var args = new Array(); 
    for (var i = 1; i < arguments.length; i++) 
     args.push(arguments[i]); 

    console.log('args: ' + args); 

    //-- different attempts 
    window[func].apply(this, args); 
    //window[func].apply(null, Array.prototype.slice.call(arguments, 1)); 
    //this[func].apply(this, Array.prototype.slice.call(arguments, 1)); 
} 


$(function() 
{ 
    console.log('\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n'); 
    console.log('ready'); 
    mainfunc('target', 'hello,', 'there!'); 
});