我一直在创建几个类,但我从来没有在类本身上有任何所需的参数。
以下代码完美无缺。
$(function()
{
search.anotherFunction('a', 'b');
});
search = function()
{
this.anotherFunction = function(param1, param2)
{
// do whatever
};
var public = { anotherFunction: anotherFunction }
return public;
}();
但是现在我想在search
内传递参数,以避免将相同的参数传递给所有函数。
$(function()
{
search('front/file.php').anotherFunction('a', 'b');
});
search = function(url)
{
this.anotherFunction = function(param1, param2)
{
// use here the 'url' parameter
};
this.anotherFunctionB = function(param1, param2)
{
// use here the 'url' parameter
};
var public = { anotherFunction: anotherFunction,
anotherFunctionB: anotherFunctionB }
return public;
}();
这不起作用,控制台输出错误。
未捕获的TypeError:对象不是函数
这意味着search
不是函数,而是类名,因此无法接收参数?
答案 0 :(得分:3)
首先,您创建"类的方式"是不正确的,最终创建全局变量:在对匿名函数的调用中,由于你调用它的方式,this
将引用全局对象*,因此this.anotherFunction = ...
将创建一个全局变量名为anotherFunction
,因为全局对象上的属性是全局变量。
如果您希望在最少的更改时继续使用当前模式,那么请不要将this.xyz = ...
用于您的功能,而是使用var
:
var search = function()
{
var anotherFunction = function(param1, param2)
{
// do whatever
};
var public = { anotherFunction: anotherFunction }
return public;
}();
另请注意,由于未声明search
,您成为The Horror of Implicit Globals的牺牲品;我添加了var
来声明它。
如果您没有调用最外层函数并将函数分配给search
变量,那么您的第二个示例(上述更改)将会起作用,然后稍后调用它:
var search = function(url)
{
var anotherFunction = function(param1, param2)
{
// use here the 'url' parameter
};
var anotherFunctionB = function(param1, param2)
{
// use here the 'url' parameter
};
var public = { anotherFunction: anotherFunction,
anotherFunctionB: anotherFunctionB }
return public;
}; // <== Note, no () here
现在search
指的是一个函数,我们可以这样调用:
var x = search("http://example.com");
x.anotherFunction(...); // Will have access to the URL
*为什么在调用匿名函数时this
引用全局对象?因为您在没有做任何事情的情况下调用它来将this
设置为其他内容,并且您正在使用松散模式。 (我知道您正在使用宽松模式,因为如果您使用严格模式,this
将为undefined
,因此this.anotherFunction = ...
会失败。)
附注:我建议您停止使用public
作为变量名称,因为它是future reserved word并且至少已经是ES3。
答案 1 :(得分:0)
您可以在此处使用JavaScript闭包。看看下面的方法:
search = function()
{
return function (url) {
this.anotherFunction = function(param1, param2)
{
// use here the 'url' parameter
};
this.anotherFunctionB = function(param1, param2)
{
// use here the 'url' parameter
};
var public = { anotherFunction: anotherFunction,
anotherFunctionB: anotherFunctionB }
return public;
}
}();
search('front/file.php').anotherFunction('a', 'b');