我知道如何在这样写的时候访问下面的成员函数:
var blady_blah=
{
some_member_function: function ()
{
}
}
我从外面访问blady_blah.some_member_function()
但是如何在这样写的时候访问成员函数:
(function() {
some_member_function: function ()
{
}
})();
答案 0 :(得分:2)
大括号{}用于定义对象文字和函数体。区别在于:
var name = {}; // Object literal
你也可以看作是
var name = {
};
这是一样的,但两者之间有一些空间,所以它仍然是一个对象文字,不幸的是它看起来非常相似:
var name = function () { // Function body
};
一个对象可以有成员:
var name = {
member: "string"
};
而功能不能;一个函数有声明:
var name = function () {
do_something();
var result = do_something_else();
};
你不能写
var name = function () {
member: "string"
};
因为你把{}的两种用法混合在了一起。
变量可以在函数中定义,但不能在函数外部看到 - 它在函数范围内:
var name = function () {
var something_useful = string;
};
答案 1 :(得分:2)
第二个例子是一个闭包(它恰好在里面有一个语法错误)。减去错误的语法,您的自我评估匿名函数如下所示:
(function() {
})();
如果您愿意,可以在其中定义对外界不可见的功能。如果您对维护干净的全局命名空间感兴趣,例如使用库代码,这将非常有用。
(function() {
function utilityFunctionFoo() {
}
function utilityFunctionBar() {
}
})();
当然,如果您想从外界打电话给任何这些功能,那你就不走运了。或者是你?实际上,还有另一种定义函数的方法:
var foo = function() {
}
这跟写作完全一样:
function foo() {
}
...除了用第二种风格编写时,你实际上可以省略var
关键字并创建一个全局变量!将所有这些结合在一起:
(function() {
publicData = "stuff accessible from outside anonymous function";
var privateData = "stuff that stays inside anonymous function";
function utilityFunctionFoo() {
}
function utilityFunctionBar() {
}
usefulFunctionExport = function() {
utilityFunctionFoo();
utilityFunctionBar();
}
})();
usefulFunctionExport();
答案 2 :(得分:1)
在函数终止后,您无法访问它。当它的父函数结束时,它是一个超出范围的局部变量。
您应该使main函数成为构造函数,以便它返回一个类的新实例(您可以将其命名为Blahdy_blah),并将成员函数作为其属性之一。
查找构造函数,返回值以及访问成员变量。
答案 3 :(得分:1)
如果要执行该功能,则需要返回公开该功能的对象。
var LIB = (function() {
var fn = {
member_function : function(){}
};
return fn;
})();
并致电
LIB.member_function();
答案 4 :(得分:0)
(function() {
blady_blah.some_member_function();
})();
如果您需要在其中添加内容,您可以这样写。
(function() {
blady_blah.some_member_function(function(){
// Do stuff...
});
})();