我对javascript中的函数和变量声明缺乏一些基本的理解,并且我很难真正理解它。
我有这个函数“urlParam”,我把它放在一个通用文件('reusable.js')中重用:
(function (ko, $) {
var urlParam = function (name, w) {
w = w || window;
var rx = new RegExp('[\&|\?]' + name + '=([^\&\#]+)'),
val = w.location.search.match(rx);
return !val ? '' : val[1];
}
})(ko,jQuery);
然后我有一个viewModel,我想访问这个函数,放在一个文件'viewmodel.js'中:
ViewModel = function(){
var userId = urlParam("UserId");
};
在我的view.html中,我包含两个文件,然后在html之后,我将视图模型绑定到视图:
ko.applyBindings(new ViewModel());
这会导致引用错误:ReferenceError: urlParam is not defined
但是如果我将urlParam函数放在(function(ko,$){})之外(ko,jQuery);声明它完美无缺。
这(function () {})();
做了什么?
答案 0 :(得分:4)
它被称为立即调用函数表达式。
What is the (function() { } )() construct in JavaScript?
表达式创建一个新的作用域,并且可以访问通过外括号传递到内括号的参数,以及作用域链中的任何变量,但是你无法访问函数中的变量,如它们隐藏在函数的范围内。
尝试这样的事情:
var urlParamVar = (function (ko, $) {
var urlParam = function (name, w) {
w = w || window;
var rx = new RegExp('[\&|\?]' + name + '=([^\&\#]+)'),
val = w.location.search.match(rx);
return !val ? '' : val[1];
}
return urlParam;
})(ko,jQuery);
这样你返回urlParam并将其设置为将保存该函数的变量urlParamVar。
但这并不是一种非常有条理的方式来做你正在尝试做的事情。
答案 1 :(得分:1)
你必须在没有" var"制作全球职能
(function (ko, $) {
urlParam = function (name, w) {
//.......
}
})(ko,jQuery);