2011-08-14 116 views
0

考虑下面的代码:是否可以在匿名函数中访问函数?

(function($) { 
    function hello(who) 
    { 
    console.log('Hello: '+who); 
    } 
})(jQuery); 

$(document).ready(function() { 
    hello('World'); 
}); 

它是如何将有可能从匿名函数外部访问Hello功能?

+0

嗯,问题。为什么你将jQuery作为参数传递给匿名函数,然后不给它命名? – Kayla

+0

@tylermwashburn:只需一些快速复制粘贴+编辑。 – PeeHaa

回答

1

假设你会想,最终其他的方法添加到这个封闭物,那么,你可以使用模块模式创建命名空间在封闭中私下公开地公布事物的方法。为了说明:

myAppNamespace.hello(myAppNamespace.world); // -> Hello: World 
myAppNamespace.hello('Bob'); // -> Hello: Bob 
myAppNamespace.helloText; // undefined 
myAppNamespace.concatText; // undefined 

另外,我用的自动执行功能的$参数,使jQuery传递的东西,你会使用$内部访问jQuery

2

你喜欢

+0

这似乎是最好的方法的最简单的例子。 –

1
(function($) { 
    function hello(who) 
    { 
    console.log('Hello: '+who); 
    } 

    $(document).ready(function() { 
    hello('World'); 
    }); 
})(jQuery); 

只是将所有的引用,我会做这样的事情

var hello = (function() { 
    return function(who) 
    { 
    console.log('Hello: '+who); 
    }; 
})(jQuery); 

$(document).ready(function() { 
    hello('World'); 
}); 

你在哪里匿名函数,然后就可以存储并访问在任何范围内返回功能到范围内的hello函数。

var myAppNamespace = (function($){ 
    var exports = {}, // the return object 
     helloText = 'Hello: '; // private variable 

    function concatText() { 
    var returnString = ''; 
    for (var i = 0, il = arguments.length; i < il; i++) { 
     returnString += arguments[i]; 
    } 
    return returnString; 
    } // private method 

    exports.world = 'World'; // public property 
    exports.hello = function (who) { 
    console.log(concatText(helloText, who)); 
    }; // public method 

    return exports; // assign exports to myAppNamespace 
}(jQuery)); 

这里的方法和属性都只是为了显示的例子: